{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e8b9a2e8-1867-45c6-8e58-45648d99faf5",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 基于python实现的线性代数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b68e2815-cb40-428b-a1a1-70bd7580cd9c",
   "metadata": {},
   "source": [
    "# 基本概念\n",
    " \n",
    "## 向量 Vector\n",
    "Vectors, and vector spaces, are fundamental to *linear algebra*, and they're used in many machine learning models. Vectors describe spatial lines and planes, enabling you to perform calculations that explore relationships in multi-dimensional space.\n",
    "\n",
    "实际上，我们在高中就学过向量的概念，例如重力，浮力都可以表现为有大小有方向的向量。\n",
    "\n",
    "**在数学中我们把既有大小又有方向的量称为向量（vector)，而把只有大小没有方向的量成为数量。对应在物理中，向量称为矢量，数量称为标量。**\n",
    "\n",
    "---\n",
    "At its simplest, a vector is a numeric element that has both *magnitude* and *direction*. The magnitude represents a distance (for example, \"2 miles\") and the direction indicates which way the vector is headed (for example, \"East\"). **Vectors are defined by an n-dimensional coordinate that describe a point in space that can be connected by a line from an arbitrary origin.**\n",
    "\n",
    "That all seems a bit complicated, so let's start with a simple, two-dimensional example. In this case, we'll have a vector that is defined by a point in a two-dimensional plane: A two dimensional coordinate consists of an *x* and a *y* value, and in this case we'll use **2** for *x* and **1** for *y*.\n",
    "\n",
    "Our vector can be written as **v**=(2,1), but more formally we would use the following notation, in which the dimensional coordinate values for the vector are shown as a matrix:\n",
    "\\begin{equation}\\vec{v} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "So what exactly does that mean? Well, the coordinate is two-dimensional, and describes the movements required to get to the end point (of *head*) of the vector - in this case, we need to move 2 units in the *x* dimension, and 1 unit in the *y* dimension. Note that we don't specify a starting point for the vector - we're simply describing a destination coordinate that encapsulate the magnitide and direction of the vector. Think about it as the directions you need to follow to get to *there* from *here*, without specifying where *here* actually is!\n",
    "\n",
    "It can help to visualize the vector, and with a two-dimensional vector, that's pretty straightforward. We just define a two-dimensional plane, choose a starting point, and plot the coordinate described by the vector relative to the starting point.\n",
    "\n",
    "Run the code in the following cell to visualize the vector **v** (which remember is described by the coordinate (2,1))."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d60fd504-4ddf-4f9c-9600-1b3f138c48bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:33:33.737859Z",
     "iopub.status.busy": "2022-03-18T06:33:33.737041Z",
     "iopub.status.idle": "2022-03-18T06:33:34.023199Z",
     "shell.execute_reply": "2022-03-18T06:33:34.022368Z",
     "shell.execute_reply.started": "2022-03-18T06:33:33.737822Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## 线性代数-向量\n",
    " \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 我们使用numpy中的数组来表示向量\n",
    "v = np.array([2,1])\n",
    "\n",
    "# 绘制图像，展现向量的空间表达.\n",
    " \n",
    "fig,axes=plt.subplots()\n",
    "axes.set_xlim(0,3)\n",
    "axes.set_ylim(0,3)\n",
    "axes.grid()\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1f626ce-5abe-4a22-bc31-020dc3580902",
   "metadata": {},
   "source": [
    "## Calculating Vector Magnitude and Direction\n",
    "We tend to work with vectors by expressing their components as *cartesian coordinates*; that is, *x* and *y* (and other dimension) values that define the number of units travelled along each dimension. So the coordinates of our (2,1) vector indicate that we must travel 2 units along the *x* axis, and *1* unit along the *y* axis.\n",
    "\n",
    "However, you can also work with verctors in terms of their *polar coordinates*; that is coordinates that describe the magnitude and direction of the vector. The magnitude is the overall distance of the vector from tail to head, and the direction is the angle at which the vector is oriented.\n",
    "\n",
    "### Calculating Magnitude\n",
    "Calculating the magnitude of the vector from its cartesian coordinates requires measuring the distance between the arbitrary starting point and the vector head point. For a two-dimensional vector, we're actually just calculating the length of the hypotenuse in a right-angled triangle - so we could simply invoke Pythagorean theorum and calculate the square root of the sum of the squares of it's components, like this:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{v_{1}\\;^{2} + v_{2}\\;^{2}}\\end{equation}\n",
    "$$\n",
    "\n",
    "The notation for a vector's magnitude is to surround the vector name with vertical bars - you can use single bars (for example, |**v**|) or double bars (||**v**||). Double-bars are often used to avoid confusion with absolute values. Note that the components of the vector are indicated by subscript indices (v<sub>1</sub>, v<sub>2</sub>,...v<sub>*n*</sub>),\n",
    "\n",
    "In this case, the vector **v** has two components with values **2** and **1**, so our magnitude calculation is:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{2^{2} + 1^{2}}\\end{equation}\n",
    "\n",
    "Which is:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{4 + 1}\\end{equation}\n",
    "\n",
    "So:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{5} \\approx 2.24\\end{equation}\n",
    "\n",
    "You can run the following Python code to get a more precise result (note that the elements of a numpy array are zero-based)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a2d61aa-f039-4cd7-b9f1-583bba3dd0d2",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "## 线性代数-向量\n",
    "# 向量大小计算\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 我们使用numpy中的数组来表示向量\n",
    "v = np.array([2,1])\n",
    "\n",
    "magnitude=np.sqrt(np.square(v[0])+np.square(v[1]))\n",
    "print(\"向量大小为：\",magnitude)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de3b90ab-b038-4e70-a37e-517f32586f3b",
   "metadata": {},
   "source": [
    "This calculation works for vectors of any dimensionality - you just take the square root of the sum of the squared components:\n",
    "\n",
    "\\begin{equation}\\|\\vec{v}\\| = \\sqrt{v_{1}\\;^{2} + v_{2}\\;^{2} ... + v_{n}\\;^{2}}\\end{equation}\n",
    "\n",
    "In Python, *numpy* provides a linear algebra library named **linalg** that makes it easier to work with vectors - you can use the **norm** function in the following code to calculate the magnitude of a vector:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "68648dd4-a9e4-4726-80b1-ef0bd22832b8",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 可以使用numpy内置方法求得范数\n",
    "import numpy as np\n",
    "\n",
    "vMag = np.linalg.norm(v)\n",
    "print (vMag)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd459a98-2e98-4f2f-8ee4-3fc7174f154f",
   "metadata": {},
   "source": [
    "### Calculating Direction 计算方向\n",
    "To calculate the direction, or *amplitude*, of a vector from its cartesian coordinates, you must employ a little trigonometry. We can get the angle of the vector by calculating the *inverse tangent*; sometimes known as the *arctan* (the *tangent*  calculates an angle as a ratio - the inverse tangent, or **tan<sup>-1</sup>**, expresses this in degrees).\n",
    "\n",
    "In any right-angled triangle, the tangent is calculated as the *opposite* over the *adjacent*. In a two dimensional vector, this is the *y* value over the *x* value, so for our **v** vector (2,1):\n",
    "\n",
    "\\begin{equation}tan(\\theta) = \\frac{1}{2}\\end{equation}\n",
    "\n",
    "This produces the result ***0.5***, from which we can use a calculator to calculate the inverse tangent to get the angle in degrees:\n",
    "\n",
    "\\begin{equation}\\theta = tan^{-1} (0.5) \\approx 26.57^{o}\\end{equation}\n",
    "\n",
    "Note that the direction angle is indicated as ***&theta;***.\n",
    "\n",
    "Run the following Python code to confirm this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "32c05773-8abd-4bf7-ae0c-3e4000d8c78b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:44:49.263218Z",
     "iopub.status.busy": "2022-03-18T06:44:49.262668Z",
     "iopub.status.idle": "2022-03-18T06:44:49.268833Z",
     "shell.execute_reply": "2022-03-18T06:44:49.268212Z",
     "shell.execute_reply.started": "2022-03-18T06:44:49.263171Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "向量对应tan值为： 0.5\n",
      "对应弧度为： 0.4636476090008061\n",
      "对应角度为： 26.56505117707799\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "tan=v[1]/v[0]\n",
    "print(\"向量对应tan值为：\",tan)\n",
    "arc=np.arctan(tan)\n",
    "print(\"对应弧度为：\",arc)\n",
    "print(\"对应角度为：\",np.degrees(arc))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f4a7a35-2f84-494a-b8b4-aa8013eeae41",
   "metadata": {},
   "source": [
    "here is an added complication however, because if the value for *x* or *y* (or both) is negative, the orientation of the vector is not standard, and a calculator can give you the wrong tan<sup>-1</sup> value. To ensure you get the correct direction for your vector, use the following rules:\n",
    "- Both *x* and *y* are positive: Use the tan<sup>-1</sup> value.\n",
    "- *x* is negative, *y* is positive: Add 180 to the tan<sup>-1</sup> value.\n",
    "- Both *x* and *y* are negative: Add 180 to the tan<sup>-1</sup> value.\n",
    "- *x* is positive, *y* is negative: Add 360 to the tan<sup>-1</sup> value.\n",
    "\n",
    "To understand why we need to do this, think of it this way. A vector can be pointing in any direction through a 360 degree arc.  Let's break that circle into four quadrants with the x and y axis through the center. Angles can be measured from the x axis in both the positive (counter-clockwise) and negative (clockwise) directions. We'll number the quadrants in the positive (counter-clockwise) direction (which is how we measure the *positive* angle) like this:\n",
    "\n",
    "    \n",
    "\n",
    "    2 | 1\n",
    "    - o -\n",
    "    3 | 4\n",
    "\n",
    "\n",
    "OK, let's look at 4 example vectors\n",
    "\n",
    " 1. Vector [2,4] has positive values for both x and y. The line for this vector travels through the point 0,0 from quadrant 3 to quadrant 1. Tan<sup>-1</sup> of 4/2 is around 63.4 degrees, which is the positive angle from the x axis to the vector line - so this is the direction of the vector.\n",
    " 2. Vector [-2,4] has a negative x and positive y. The line for this vector travels through point 0,0 from quadrant 4 to quadrant 2. Tan<sup>-1</sup> of 4/-2 is around -64.4 degrees, which is the *negative* angle from x to the vector line; but in the wrong direction (as if the vector was travelling from quadrant 2 towards quadrant 4). So we need the opposite direction, which we get by adding 180.\n",
    " 3. Vector [-2,-4] has negative x and y. The line for the vector travels through 0,0 from quadrant 1 to quadrant 3. Tan<sup>-1</sup> of -4/-2 is around 63.4 degrees, which is the angle between the x axis and the line, but again in the opposite direction, from quadrant 3 to quadrant 1; we need to go a further 180 degrees to reflect the correct direction.\n",
    " 4. Vector [2,-4] has positive x and negative y. It travels through 0,0 from quadrant 2 to quadrant 4. Tan<sup>-1</sup> of -4/2 is around -64.4 degrees, which is the *negative* angle from the x axis to the vector line. Technically it's correct, the line is travelleing down and to the right at an angle of -63.4 degrees; but we want to express the *positive* (counter-clockwise) angle, so we add 360.\n",
    "\n",
    "\n",
    "In the previous Python code, we used the *math.**atan*** function to calculate the inverse tangent from a numeric tangent. The *numpy* library includes a similar ***arctan*** function. When working with numpy arrays, you can also use the *numpy.**arctan2*** function to return the inverse tangent of an array-based vector in *radians*, and you can use the *numpy.**degrees*** function to convert this to degrees. The ***arctan2*** function automatically makes the necessary adjustment for negative *x* and *y* values."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "605403da-2060-493c-b6b9-c8fce06174c6",
   "metadata": {},
   "source": [
    "## Vector Addition 向量的加法\n",
    "So far, we've worked with one vector at a time. What happens when you need to add two vectors.\n",
    "\n",
    "Let's take a look at an example, we already have a vector named **v**, as defined here:\n",
    "\\begin{equation}\\vec{v} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "Now let's create a second vector, and called **s** like this:\n",
    "\\begin{equation}\\vec{s} = \\begin{bmatrix}-3 \\\\ 2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Run the cell below to create **s** and plot it together with **v**:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9fd08270-5506-4791-b8dc-16ddde985022",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:49:45.073581Z",
     "iopub.status.busy": "2022-03-18T06:49:45.073150Z",
     "iopub.status.idle": "2022-03-18T06:49:45.405843Z",
     "shell.execute_reply": "2022-03-18T06:49:45.405206Z",
     "shell.execute_reply.started": "2022-03-18T06:49:45.073548Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsUAAAKvCAYAAACCpLIkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xm8XlV97/HvysAYRgkCRkAQo4iIgopTTaxaFCoVq9cBbdUarVi1zjiLQ71SRa/4UnCoA9Saq+KAIuCQoi0qpmWUQRQHEAVEkCBz1v1jhQtaICFn5+xzznq/X6+8PJs8eZ6fKyc5n+yzn7VLrTUAANCzWWMPAAAAYxPFAAB0TxQDANA9UQwAQPdEMQAA3RPFAAB0b7AoLqXMLqX8dynl2KGeEwAAJsOQZ4pfmuTsAZ8PAAAmxSBRXEpZkGTfJB8d4vkAAGAyzRnoed6X5NVJNrm9B5RSliRZkiQbbLDBnttvv/1AL83KlSsza5bLw4dgLYdlPYdlPYdjLYdlPYdlPYd13nnnXVZrnb+6x004iksp+yW5pNa6vJSy6PYeV2s9MsmRSbJw4cJ67rnnTvSlWWXZsmVZtGjR2GPMCNZyWNZzWNZzONZyWNZzWNZzWKWUn6/J44b4Z8jDkzyxlPKzJP+W5NGllKMGeF4AAJgUE47iWuvBtdYFtdYdkzwtybdqrQdOeDIAAJgkLlgBAKB7Q73RLklSa12WZNmQzwkAAOuaM8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRvwlFcStmglPKDUspppZSzSilvHWIwAACYLHMGeI7rkjy61rqilDI3yXdLKcfVWr83wHMDAMA6N+EorrXWJCtWHc5d9aNO9HkBAGCylNa0E3ySUmYnWZ7knkk+WGt9zW08ZkmSJUkyf/78PZcuXTrh16VZsWJF5s2bN/YYM4K1HJb1HJb1HI61HJb1HJb1HNbixYuX11r3Wt3jBoni//9kpWye5Jgk/1BrPfP2Hrdw4cJ67rnnDva6vVu2bFkWLVo09hgzgrUclvUclvUcjrUclvUclvUcVilljaJ40N0naq1XJPl2kn2GfF4AAFiXhth9Yv6qM8QppWyY5LFJzpno8wIAwGQZYveJbZN8ctV1xbOSLK21HjvA8wIAwKQYYveJ05M8YIBZAABgFO5oBwBA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdmzP2AKyBU09NTjst2WGH9mPBgmTu3LGnAgCYMUTxdHD44cknPpHMm5fceGNyzTXJ5psn222X7LRT8tSnJh/5SHLggcmGG449LQDAtDPhyydKKXcvpXy7lPKjUspZpZSXDjEYt/K2tyXrr59ceWVy9dXJypXJ5ZcnZ56ZfPnLya9/nSxZkixfPvakAADT0hDXFN+Y5BW11l2T7J3koFLKrgM8LzfbdtvkjW9MNt74tn++lGTffZOH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n5PPfa6dNV6+fOypAIB1RBTDHXnFK9od8ZJkr72Shz2sbecGAMwoohhWZ7PN2lnjT34yOfnkZM6ctp0bADBjiGJYU89+dnLNNclWWyWPeUyy447t1tEAwLQniuHO2GCD5NJLk2OPTX7+82T99ds1xwDAtCaKYW3su29yww3J/e7XdqdYf/1kxYqxpwIA1pIohrU1Z05y+unJd7/bLqPYZJPkwx8eeyoAYC2IYpiohz+87Uixzz7J3/99u0Peb3879lQAwJ0gimEIs2Ylxx2XnHFGO95qq+Stbx13JgBgjYliGNJuuyUrVybPeU7ylre0s8a//OXYUwEAqyGKYWilJB//eHLBBe14++2TF77QraIBYAoTxbCu7LhjC+GDD06OOKJdYnH22WNPBQDcBlEM69o735n85jft4113Tf7qr5w1BoApRhTDZNh66xbC739/8qUvtbPG3//+2FMBAKuIYphML3lJ8vvft4/33jt50IPadm4AwKhEMUy2TTZpZ42PPjr54Q/bTUCOP37sqQCga6IYxvKMZyTXXptst1278cfd7pZcd93YUwFAl0QxjGn99ZOLLmo3/vjVr5INNkg+85mxpwKA7ohimAr22Se54YZkzz3bGeRSkquuGnsqAOiGKIapYs6cdo3xySe34003TT7wgXFnArgD11yTrFjRbuS5YsVt/7j22rGnhDUjimGq2Xvv9hXmL/+y7VZRSnLppWNPBfBHfv/7ZMstky22SE49tX38pz823zzZaSdbszM9DBLFpZSPl1IuKaWcOcTzQfdKSb785eSss9rx1lsnr3/9uDMB3MommyT3vW9y440tem+44X/+WH/95KCD2l9pMNUNdab4E0n2Gei5gJvtums7a7xkSbszXinJz38+9lQAKSU57LBko41u++fXWy95+MOT171ucueCtTVIFNdaT0py+RDPBfyJUpIjjrglhnfcMXne83w/EhjdIx/ZLpG4LXe5S7J0qbPETB+lDvSFtZSyY5Jja6273c7PL0myJEnmz5+/59KlSwd5XZIVK1Zk3rx5Y48xI0yLtfzVr5KLL24f3/e+bRu3KWparOc0Yj2HYy0n7vLLkwsuaB8vWLAiF154y3rOmpXc+97JhhuONNw05/NzWIsXL15ea91rdY+bMxnDJEmt9cgkRybJwoUL66JFiybrpWe8ZcuWxXoOY9qs5WWX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xfDDHz4pLw8wLYhigMm0cGE7a3zQQcmhh7Za/elP18lLffWr7ekf/eh2fOaZLYYf+MB18nIA05ooBphspSSHH55ceGE73nnn5MADW7EO4P/+3/YS++3X/vf889tT3/e+gzw9wIwkigHGcre7tVp9+9uTo49ut4k77bS1frpPfKJF8FOfmmy6afKLX7ST0jvvPNzIADOVKAYY2+tfn/z2t+3jPfZo1zusXLlGv7TW5AMfaDH8nOe0zv71r9vub3e/+zqcGWCGGSSKSyn7lFLOLaWcX0p57RDPCdCVLbdshXvkke2dcbNnJyeddLsPrzUqFYoaAAAPuklEQVR517vayeWXvCS5971bV194YXLXu07i3AAzxISjuJQyO8kHkzw+ya5Jnl5K2XWizwvQpec/P1mxItloo+RRj2q1e8MN//+na01e97oWwwcfnDzoQe2s8Nlnt64GYO3MGeA5Hpzk/FrrT5OklPJvSfZP8qMBnhugPxtvnFx9dfKFL7S9jddbLyu/8MX8csVmmbXqVMajH5185SutnQGYuCEun7hbkl/e6vjCVf8NgIk44IDk+uuTXXbJrAP+Kr+75Ibsv39y7bXJN78piAGGVOoEtwAqpfx1kn1qrX+36vhZSR5Sa33xnzxuSZIlSTJ//vw9ly5dOqHX5RYrVqzIvHnzxh5jRrCWw7Kew6k31Vx9zdXWcyA+N4dlPYdlPYe1ePHi5bXWvVb3uCEun7goya3f47xg1X/7I7XWI5McmSQLFy6sixYtGuClSZJly5bFeg7DWg7Leg7Leg7HWg7Leg7Leo5jiMsnTkmySynlHqWU9ZI8LcmXB3heAACYFBM+U1xrvbGU8uIkxyeZneTjtdazJjwZAABMkiEun0it9WtJvjbEcwEAwGRzRzsAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALo3oSgupTyllHJWKWVlKWWvoYYCAIDJNNEzxWcmOSDJSQPMAgAAo5gzkV9caz07SUopw0wDAAAjKLXWiT9JKcuSvLLW+sM7eMySJEuSZP78+XsuXbp0wq9Ls2LFisybN2/sMWYEazks6zks6zkcazks6zks6zmsxYsXL6+1rvYy39WeKS6lfCPJNrfxU6+vtX5pTQeqtR6Z5MgkWbhwYV20aNGa/lJWY9myZbGew7CWw7Kew7Kew7GWw7Kew7Ke41htFNdaHzMZgwAAwFhsyQYAQPcmuiXbk0opFyZ5aJKvllKOH2YsAACYPBPdfeKYJMcMNAsAAIzC5RMAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdE8UAAHRPFAMA0D1RDABA90QxAADdm1AUl1IOLaWcU0o5vZRyTCll86EGAwCAyTLRM8UnJtmt1rp7kvOSHDzxkQAAYHJNKIprrSfUWm9cdfi9JAsmPhIAAEyuIa8pfm6S4wZ8PgAAmBSl1nrHDyjlG0m2uY2fen2t9UurHvP6JHslOaDezhOWUpYkWZIk8+fP33Pp0qUTmZtbWbFiRebNmzf2GDOCtRyW9RyW9RyOtRyW9RyW9RzW4sWLl9da91rd41Ybxat9glL+NskLkvx5rfUPa/JrFi5cWM8999wJvS63WLZsWRYtWjT2GDOCtRyW9RyW9RyOtRyW9RyW9RxWKWWNonjOBF9knySvTvKoNQ1iAACYaiZ6TfHhSTZJcmIp5dRSyocHmAkAACbVhM4U11rvOdQgAAAwFne0AwCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCge6IYAIDuiWIAALonigEA6J4oBgCgexOK4lLK20opp5dSTi2lnFBK2W6owQAAYLJM9EzxobXW3WuteyQ5NsmbBpgJAAAm1YSiuNb6+1sdbpykTmwcAACYfKXWiXVsKeUdSZ6d5Moki2utl97O45YkWZIk8+fP33Pp0qUTel1usWLFisybN2/sMWYEazks6zks6zkcazks6zks6zmsxYsXL6+17rW6x602iksp30iyzW381OtrrV+61eMOTrJBrfXNq3vRhQsX1nPPPXd1D2MNLVu2LIsWLRp7jBnBWg7Leg7Leg7HWg7Leg7Leg6rlLJGUTxndQ+otT5mDV/z6CRfS7LaKAYAgKlkortP7HKrw/2TnDOxcQAAYPKt9kzxaryrlLIwycokP0/ywomPBAAAk2tCUVxrffJQgwAAwFjc0Q4AgO6JYgAAuieKAQDonigGAKB7ohgAgO6JYgAAuieKAQDonigGAKB7ohgA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\n",
      "text/plain": [
       "<Figure size 864x864 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt \n",
    "import numpy as np \n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(12,12)\n",
    "v=np.array([2,1])\n",
    "s=np.array([-3,2])\n",
    "axes.set_xlim(-4,4)\n",
    "axes.set_ylim(-4,4)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,s[0],s[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1f8551f-0d84-4c95-988e-a76ea23789c1",
   "metadata": {},
   "source": [
    "You can see in the plot that the two vectors have different directions and magnitudes. So what happens when we add them together?\n",
    "\n",
    "Here's the formula:\n",
    "\\begin{equation}\\vec{z} = \\vec{v}+\\vec{s}\\end{equation}\n",
    "\n",
    "In terms of our vector matrices, this looks like this:\n",
    "\\begin{equation}\\vec{z} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix} + \\begin{bmatrix}-3 \\\\ 2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Which gives the following result:\n",
    "\\begin{equation}\\vec{z} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix} + \\begin{bmatrix}-3 \\\\ 2 \\end{bmatrix} = \\begin{bmatrix}-1 \\\\ 3 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Let's verify that Python gives the same result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "24e4f696-9646-4b15-9be5-b83a5ed0a2b8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:52:31.941113Z",
     "iopub.status.busy": "2022-03-18T06:52:31.940360Z",
     "iopub.status.idle": "2022-03-18T06:52:31.945042Z",
     "shell.execute_reply": "2022-03-18T06:52:31.944455Z",
     "shell.execute_reply.started": "2022-03-18T06:52:31.941078Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "向量相加结果： [-1  3]\n"
     ]
    }
   ],
   "source": [
    "z=v+s\n",
    "print(\"向量相加结果：\",z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "be8d34ad-f552-4df9-9e48-2b858e6b460e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:57:29.719721Z",
     "iopub.status.busy": "2022-03-18T06:57:29.718901Z",
     "iopub.status.idle": "2022-03-18T06:57:29.958078Z",
     "shell.execute_reply": "2022-03-18T06:57:29.957463Z",
     "shell.execute_reply.started": "2022-03-18T06:57:29.719682Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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L6CztfbarNv9gTOttTf95n4DgYEAycnJLVOznqj2VUZGBomevx6E78fge37QMUQLHUN06NSp0xxrbavs7lckgH2tAaoddbtq1sf+h7V2BDACoH79+jYlJSWAXYcnLS0NHUO4fM8POoZooWPwSxAPFX4D1DXG1DLGFAX6AuMD2K6IiMjvRHzGZa09aIy5CZgMxAKvWGsXR5xMRETkGIJ4qBBr7SRgUhDbEhERORFNzhAREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8UpExWWM6W2MWWyMyTTGtAoqlIiIyPFEesa1COgJfBZAFhERkWwVieSLrbVLAYwxwaQRERHJhrHWRr4RY9KAO6y1s09wn4HAQIDk5OSWqampEe83TBkZGSQmJoYdIyK+H4Pv+UHHEC10DNGhU6dOc6y12T7tlO0ZlzFmClDpGJ8aYq19P6eBrLUjgBEA9evXtykpKTn90qiUlpaGjiFcvucHHUO00DH4Jdvistaelx9BREREckLL4UVExCuRLoe/1BizGmgDfGCMmRxMLBERkWOLdFXhe8B7AWURERHJlh4qFBERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxiopLRES8ouISERGvqLhERMQrKi4REfGKiktERLyi4hIREa+ouERExCsqLhER8YqKS0REvKLiEhERr6i4RETEKyouERHxSkTFZYx5zBizzBizwBjznjGmdFDBREREjiXSM65PgNOttU2A5cC9kUcSERE5voiKy1r7sbX2YNbN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\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt \n",
    "import numpy as np \n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(7,7)\n",
    "v=np.array([2,1])\n",
    "s=np.array([-3,2])\n",
    "axes.set_xlim(-4,4)\n",
    "axes.set_ylim(-4,4)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,s[0],s[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n",
    "axes.arrow(0,0,z[0],z[1],head_length=0.1,head_width=0.1,color='green')\n",
    "axes.plot([v[0],z[0]],[v[1],z[1]],'--')\n",
    "axes.plot([s[0],z[0]],[s[1],z[1]],'--')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "94b6d7fd-e405-4fce-ad87-f317b74923a8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T06:58:51.801945Z",
     "iopub.status.busy": "2022-03-18T06:58:51.801514Z",
     "iopub.status.idle": "2022-03-18T06:58:52.022522Z",
     "shell.execute_reply": "2022-03-18T06:58:52.021689Z",
     "shell.execute_reply.started": "2022-03-18T06:58:51.801911Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "向量相减结果： [ 5 -1]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAGfCAYAAAAH0zaSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xd4FVX+x/H3SSGU0Ak19BI6EhAQFAICIrKyK0UECxpkbchaVlF0XduuigVwVywB1BVkwS6r8EM0gAqohF4CiiggVUWIAgFyfn+cFFQgQG4ynOTzep483jszd+bLEe4nM3PmHGOtRURExBdhQRcgIiJyKhRcIiLiFQWXiIh4RcElIiJeUXCJiIhXFFwiIuKVkASXMaacMeY1Y8w6Y8xaY8w5odiviIjIb0WEaD/jgFnW2v7GmGJAyRDtV0RE5FdMXh9ANsaUBZYB9ayeZhYRkXwWijOuusAuYLIxphWwBBhprf356I2MMcOB4QDFixdvU6tWrRAc2l8ZGRmEhRXtW4xqA7UBqA1AbZBl/fr1u621MbltF4ozrrbAIqCTtXaxMWYcsNdae+/xPhMXF2dTU1PzdFzfJScnk5CQEHQZgVIbqA1AbQBqgyzGmCXW2ra5bReKiN8CbLHWLs58/xoQH4L9ioiI/E6eg8taux3YbIyJy1x0PrAmr/sVERE5llD1KhwBTMnsUbgRuDpE+xUREfmVkASXtXYZkOt1SRERkbxSNxYREfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERr4QsuIwx4caYpcaYmaHap4iIyG+F8oxrJLA2hPsTERH5nZAElzEmFrgISArF/kRERI7HWGvzvhNjXgP+CZQGbrfW9jnGNsOB4QAxMTFtpk+fnufj+iwtLY3o6OigywiU2kBtAGoDUBtk6dq16xJrbdvctovI64GMMX2AndbaJcaYhONtZ619HngeIC4uziYkHHfTIiE5ORm1gdpAbaA2ALXBqQrFpcJOwMXGmE3ANKCbMeaVEOxXRETkd/IcXNbau6y1sdbaOsAg4ENr7eV5rkxEROQY9ByXiIh4Jc/3uI5mrU0GkkO5TxERkaPpjEtERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERryi4RETEKwouERHxioJLRES8ouASERGvKLhERMQrCi4REfGKgktERLyi4BIREa8ouERExCsKLhER8YqCS0REvKLgEhERr+Q5uIwxNY0xHxlj1hhjVhtjRoaiMMkHhw/D99+DtUFXIiJy2kJxxnUYuM1a2xToANxojGkagv1KqL38MlSqBCVKQK1acPPNQVckInLK8hxc1tpt1tqUzNf7gLVAjbzuV/JBnz5QqhQcPAj7v4OfFkP6L0FXJSJySowN4WUjY0wdYD7Q3Fq79zfrhgPDAWJiYtpMnz49ZMf1UVpaGtHR0QV/4B07YOtWah9Ipm76PA6bKHZV6cSOKl3ZU645mIK77RlYG5xB1AZqA1AbZOnatesSa23b3LYLWXAZY6KBecDD1to3TrRtXFycTU1NDclxfZWcnExCQkLBH/jQIRgwAEbcBK8/DVv/D5pGQpSBSo3ghsUQVjDhFVgbnEHUBmoDUBtkMcacVHBFhOhgkcDrwJTcQksCFhkJb73lXp/fHb75BhrUgbgI6FkyJ7Te+DNUbw3N+0F0TGDlioj8Vih6FRpgIrDWWvtk3kuSAlW7Nhyy8KdR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\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt \n",
    "import numpy as np \n",
    "z=v-s\n",
    "print(\"向量相减结果：\",z)\n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(7,7)\n",
    "v=np.array([2,1])\n",
    "s=np.array([-3,2])\n",
    "axes.set_xlim(-6,6)\n",
    "axes.set_ylim(-6,6)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,s[0],s[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n",
    "axes.arrow(0,0,z[0],z[1],head_length=0.1,head_width=0.1,color='green')\n",
    "axes.plot([v[0],z[0]],[v[1],z[1]],'--')\n",
    "axes.plot([s[0],z[0]],[s[1],z[1]],'--')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d42bf74-338f-4a8f-a18c-4cbd34c58d55",
   "metadata": {},
   "source": [
    "So what's going on here?\n",
    "Well, we added the dimensions of **s** to the dimensions of **v** to describe a new vector **z**. Let's break that down:\n",
    "- The dimensions of **v** are (2,1), so from our starting point we move 2 units in the *x* dimension (across to the right) and 1 unit in the *y* dimension (up). In the plot, if you start at the (0,0) position, this is shown as the red arrow.\n",
    "- Then we're adding **s**, which has dimension values (-3, 2), so we move -3 units in the *x* dimension (across to the left, because it's a negative number) and then 2 units in the *y* dimension (up). On the plot, if you start at the head of the red arrow and make these moves, you'll end up at the head of the green arrow, which represents **z**.\n",
    "\n",
    "The same is true if you perform the addition operation the other way around and add **v** to **s**, the steps to create **s** are described by the blue arrow, and if you use that as the starting point for **v**, you'll end up at the head of the green arrow, which represents **z**.\n",
    "\n",
    "Note on the plot that if you simply moved the tail of the blue arrow so that it started at the head of red arrow, its head would end up in the same place as the head of the green arrow; and the same would be true if you moved tail of the red arrow to the head of the blue arrow."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab0c579c-5642-402b-b8e7-adb0ae6db3c8",
   "metadata": {},
   "source": [
    "## Vector Multiplication 向量乘法\n",
    "Vector multiplication can be performed in three ways:\n",
    "\n",
    "- Scalar Multiplication\n",
    "- Dot Product Multiplication\n",
    "- Cross Product Multiplication\n",
    "\n",
    "## Scalar Multiplication 标量相乘\n",
    "Let's start with *scalar* multiplication - in other words, multiplying a vector by a single numeric value.\n",
    "\n",
    "Suppose I want to multiply my vector by 2, which I could write like this:\n",
    "\n",
    "\\begin{equation} \\vec{w} = 2\\vec{v}\\end{equation}\n",
    "\n",
    "Note that the result of this calculation is a new vector named **w**. So how would we calculate this?\n",
    "Recall that **v** is defined like this:\n",
    "\n",
    "\\begin{equation}\\vec{v} = \\begin{bmatrix}2 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "To calculate 2v, we simply need to apply the operation to each dimension value in the vector matrix, like this:\n",
    "\n",
    "\\begin{equation}\\vec{w} = \\begin{bmatrix}2 \\cdot 2 \\\\  2 \\cdot 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "Which gives us the following result:\n",
    "\n",
    "\\begin{equation}\\vec{w} = \\begin{bmatrix}2 \\cdot 2 \\\\  2 \\cdot 1 \\end{bmatrix} = \\begin{bmatrix}4 \\\\ 2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "In Python, you can apply these sort of matrix operations directly to numpy arrays, so we can simply calculate **w** like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "5d1d0f57-5be6-4ae1-954e-27ae0bf71e38",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-18T07:29:51.564772Z",
     "iopub.status.busy": "2022-03-18T07:29:51.564013Z",
     "iopub.status.idle": "2022-03-18T07:29:51.756883Z",
     "shell.execute_reply": "2022-03-18T07:29:51.756041Z",
     "shell.execute_reply.started": "2022-03-18T07:29:51.564738Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAGfCAYAAAAH0zaSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAFpRJREFUeJzt3XmwnXWd5/HPLwkB8SKLSFQCRsAWEBg1V3aHG3FsEFzacVy6dMSl6ClA0dFSFktnarpbLculQaweWhFn2pogrZbi4ChgLg2yDAmLGgIOq4ZFQQgQBCG5v/njxGIx67mHPOd37+tVlao8N0+e55sf4b7znPOcc0qtNQDQihldDwAAm0K4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANGVWFyfdcccd67x587o49QY9/PDDefazn931GM2xbv2xbv2xbv0Z9nVbsmTJvbXW521ov07CNW/evCxevLiLU2/Q+Ph4xsbGuh6jOdatP9atP9atP8O+bqWU2zdmPw8VAtAU4QKgKcIFQFOEC4CmCBcATREuAJoiXAA0RbgAaIpwAdAU4QKgKcIFQFOEC4CmCBcATREuAJoiXAA0RbgAaIpwAdAU4QKgKcIFQFOEC4CmCBcATREuAJoiXAA0RbgAaIpwAdAU4QKgKcIFQFOEC4CmCBcATREuAJoiXAA0RbgAaIpwAdCUgYWrlDKzlHJNKeWHgzomADzdIK+4TkyybIDHA4A/M5BwlVLmJjkqydcGcTwAWJdSa538QUr5lySfSbJNko/VWo9eyz7HJjk2SebMmTN/4cKFkz7vM2HlypUZGRnpeozmWLf+WLf+WLf+DPu6LViwYEmtdXRD+82a7IlKKUcn+V2tdUkpZWxd+9Vaz0xyZpKMjo7WsbF17tqp8fHxDOtsw8y69ce69ce69WeqrNsgHio8JMkbSym3JVmY5DWllH8ewHEB4M9MOly11pNrrXNrrfOSvCPJT2ut75r0ZACwFl7HBUBTJv0c15PVWseTjA/ymADwZK64AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCmTDlcpZZdSyqJSyvWllKWllBMHMRgArM0grrhWJflorXXvJAcmOb6UsvcAjgvAoJx6anL99ck++/R+7LdfcsstXU/Vl1mTPUCt9a4kd635+UOllGVJdk5y/WSPDcCArFiRPPe5ydKlve2RkWT27G5n6lOptQ7uYKXMS/KvSfaptT74tF87NsmxSTJnzpz5CxcuHNh5B2nlypUZGRnpeozmWLf+WLf+WLdNtGJFcvPNWTl3bkaWL09mzEj22CPZZpuuJ3uKBQsWLKm1jm5wx1rrQH4kGUmyJMlbNrTv/Pnz67BatGhR1yM0ybr1x7r1x7ptpLPPrjXp/dhmm7rorLNqLaXWT32q68nWKsniuhG9GchdhaWULZJ8J8m3aq3fHcQxAejTV7+alJIcc0yy887Jb3+bPPhgsuuuyZlnJp/+dNcTTsog7iosSb6eZFmt9YuTHwmATVZr8rnP9YJ1/PHJnnsm992XLF+e7LRTb5+ZM5MPfKD3UGHDBjH9IUneneQ1pZRr1/x4/QCOC8CG1Jp88pO9GJ10UvKqV/WurpYtS7bfvuvpnhGDuKvw0iRlALMAsLEmJpKPfCQ57bTe9uGHJ+edlzzrWd3OtRlMOlwAbEarV/ce7jv77N72m9+cnHNOs7e290O4AFrw+OPJO9+ZfOc7ve13vzs566xk1vT7Nj79/sQALXn00eSNb0wuuKC3fdxxyemnN3+DxWRM3z85wDB7+OHk4IN7z1ldcEHyiU/0ntc644xpHa3EFRfAcHnggeTQQ5Nf/rK3/bd/m5xySu82d5IIF8BwuPfeZHQ0uf323vY//EPyoQ91O9OQEi6ALt15Z7Lvvr0XCyfJ176WvP/93c405IQLoAu33Za85CXJqlW97YULk7e/vdORWiFcAJvTjTf23o7pT37wg+QNb+hungYJF8DmcN11yctf/sT2hRf23u2CTSZcAM+kK69MDjzwie2f/ax3mzt9Ey6AZ8KiRclrXvPE9tVXJ694RXfzTCHCBTBI55+fHHXUE9vXX5/stVd380xB0/vl1wCDcu65vRcJH3VU750tbr6595EjojVwwgUwGWef3QvW296WbLtt74MbV69Odtut68mmLOEC6McZZ/SC9d73Jrvskvz2t8mKFcnOO3c92ZQnXAAbq9bks5/tBeuEE3oPA953X/LrXyc77dT1dNOGcAFsSK3Jqaf2nrs6+eTkgAOShx7q3Xix/fZdTzftuKsQYF0mJpITT0y+8pXe9uGHJ+ed1/uoETojXABPt3p1741uv/nN3vZf/VXvvQRnz+52LpIIF8ATHn88ecc7ku9+t7f9nvckX/96MnNmt3PxFMIF8OijvTe6vfDC3vYJJ/Q+D2uaf9LwsPJfBZi+Vq5MDjqo95zVhRcmJ53Ue17r9NNFa4i54gKmnxUrkkMPTZYu7W3//d/3olVKt3OxUYQLmD7uuSeZPz/5zW9626edlnzwg93OxCYTLmDqu/POZJ99kvvv722fdVbvHS9oknABU9ettyYveUnv9vYkOeec3nsK0jThAqaeG2546ruyn3decvTR3c3DQAkXMHVce+1TP6zxooue+mGOTAnCBbTviit6t7X/yWWXPXWbKcULFYCmnHhi75HAgw5Kjt97Ue8W9j9F6pprem+IK1pTmisuoCnXXZfsu+sDufyKJ15z9cAVy7LtAXt2OBWbkysuoBmXfeTbGb+4ZI/clFWZmb22vCWLr6qiNc0IFzD0LnnfN5JScvCX3577y/a5aev9suWMVTnhCy/O6GjX07G5CRcwtC5+6+lJKXn1N96XO2bumnuv/122n7gvu+6+RU4/PTnuuK4npAvCBQyVOlGz6C8/k5SSw77zody05cvywG33Z+dVt2fHvZ6XpPexWMcd560FpyvhAoZCnagZP+jklJkzsuAnp+QXIwdl5V0PZY9Hf5ltX7Rd1+MxRIQL6NTEqolcvN8JKTNnZOyKz2bJDq/No/c/kn0fuiwjzx/pejyGkHABnVj92Opcuvt7MmOLmTnsF2fk8hf++zz+8GOZ//sLstV2W3U9HkNMuIDN6rGHH88VL3xLZm45K4fe8j9yye7HZPUfV+WgO/4lW2y9Rdfj0QDhAjaLR+57JFfv8NrMHpmdA+/6Xi7e74OZeHx1Xn3TNzJz9syux6MhwgU8o1bevTK/HDkwz3ru1nnl/Rdl0cGnpK6eyGHXnZYZs3wLYtP5WwM8Ix64fUVu3nLvjLxgm+zz8JUZ/8vPpK6eyIKf/V3KDPex0z/hAgbq3mX35M5Zu2Tbedtn98eW9V5EXGvG/s9JgsVACBcwEHctviMPlO2y49475YWrl+fS938jqTWHnXtC16MxxQgXMCm/Hr8lE2VGXvCqudk2D+Tyj3w7qTWHfu2YrkdjihIuoC83/3BZUkp2XbB7ZqTm/376fye15qAv/oeuR2OKEy5gk9zwv65JSsnub9g7SXLtlxYltWb///L6jidjuhAuYKP8/MzLk1Ky51+/Mknyy3+6PKk1L//wWLeDMe0IF7Be13zhp0kp2e9vDk6S3HjOtUmt2ecDB3Y8GdOVcAFrdeWnfpiUkld87PAkya3nL0tqzUvf9m86nozpTriAp7jsxHOSUnLAf3tDHssWWX7JrUmtefGRe3Y9GiQRLmCNS957VlJKDj7tHbmv7JC7l9yR2fWxzD10XtejwVMIF0xz4285LSklrz77/Vk+80W59/rfZYeJ3+f5r3xh16PBWgkXTEN1omb83/1dUkrGvndifrXlvllx24rMXXVbdtzreV2PB+slXDCN1Ima8QNP6n3a8IWfzM+3OTgP3/1Q/uLRn2e7F23b9XiwUYQLpoGJVRO5eJ/je8G68nNZ/NzX5dH7H8l+D/4sz54z0vV4sEmEC6awVX9cnUt3+4+ZscXMHLb0q7l857fm8Ycfy+i9P85W223V9XjQF+GCKeixlY/lyhe8ObO2mpVDb/2fuWSPY7L6j6ty0PJzs8XWW3Q9HkyKcMEU8sh9j+TqHV6b2dtsmQPu/n4ufvmJmXh8dV79/76RmbNndj0eDIRwwRSw8q6HsvTZ++dZz906r7z/oowfcmrq6okcds2XM2OW/82ZWvyNhoatuPX+3DJ7z4y88Dl52R+uyvgRn01dPZGxS//Wpw0zZQkXNOiepb/LXTPnZrvddshuj9+Yf33bV5JaM/ajTwgWU55wQUPuump5HizPyfP2mZMXTNyRSz9wdlJr/u05x3c9Gmw2wgUNuP2nNyel5AX775Ln5KFc/p/PTWrNof/0nq5Hg81OuGCI3fSD65NS8qLD90iSXPVfz09qzUFfeGvHk0F3hAuG0LJvXZ2Ukj3e9LIkybVfWpTUmld96siOJ4PuDSRcpZQjSik3llJuKqWcNIhjwnT0i/9+WVJK9nrX/CTJ0rOuTGrNyz881u1gMEQmHa5SyswkZyQ5MsneSd5ZStl7sseF6eTqz1+UlJJ9/9MhSZJfnXtdUmte9t79O54Mhs+sARxj/yQ31VpvSZJSysIkb0py/QCODVPaH+58ICklr1yzfcv5N2S3I1+av+h0Khhug3iocOckv3nS9vI1XwPW4/c33put77opf8zsLL/k1qTW7HbkS7seC4ZeqbVO7gClvDXJEbXWD6zZfneSA2qtJzxtv2OTHJskc+bMmb9w4cJJnfeZsnLlyoyM+JiHTWXd+mPd+mPd+jPs67ZgwYIltdbRDe03iIcK70iyy5O256752lPUWs9McmaSjI6O1rGxsQGcevDGx8czrLMNM+vWH+vWH+vWn6myboN4qPCqJC8ppby4lDI7yTuS/GAAxwWAPzPpK65a66pSyglJfpxkZpKzaq1LJz0ZAKzFIB4qTK31/CTnD+JYALA+3jkDgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmjKpcJVSPl9KuaGU8vNSyvdKKdsNajAAWJvJXnFdkGSfWut+SX6V5OTJjwQA6zapcNVaf1JrXbVm84okcyc/EgCs2yCf43pfkh8N8HgA8GdKrXX9O5RyYZLnr+WXTq21fn/NPqcmGU3ylrqOA5ZSjk1ybJLMmTNn/sKFCycz9zNm5cqVGRkZ6XqM5li3/li3/li3/gz7ui1YsGBJrXV0Q/ttMFwbPEApxyT5mySH11r/sDG/Z3R0tC5evHhS532mjI+PZ2xsrOsxmmPd+mPd+mPd+jPs61ZK2ahwzZrkSY5I8vEkh21stABgMib7HNdXkmyT5IJSyrWllH8cwEwAsE6TuuKqte4xqEEAYGN45wwAmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoinAB0BThAqApwgVAU4QLgKYIFwBNES4AmiJcADRFuABoykDCVUr5aCmlllJ2HMTxAGBdJh2uUsouSV6X5NeTHwcA1m8QV1xfSvLxJHUAxwKA9ZpUuEopb0pyR631ugHNAwDrVWpd/4VSKeXCJM9fyy+dmuSUJK+rtT5QSrktyWit9d51HOfYJMcmyZw5c+YvXLhwMnM/Y1auXJmRkZGux2iOdeuPdeuPdevPsK/bggULltRaRze03wbDtc7fWMq+SS5K8oc1X5qb5M4k+9da717f7x0dHa2LFy/u67zPtPHx8YyNjXU9RnOsW3+sW3+sW3+Gfd1KKRsVrln9nqDW+oskOz3phLdlPVdcADAIXscFQFP6vuJ6ulrrvEEdCwDWxRUXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCnCBUBThAuApggXAE0ptdbNf9JS7kly+2Y/8cbZMcm9XQ/RIOvWH+vWH+vWn2FftxfVWp+3oZ06CdcwK6UsrrWOdj1Ha6xbf6xbf6xbf6bKunmoEICmCBcATRGuP3dm1wM0yrr1x7r1x7r1Z0qsm+e4AGiKKy4AmiJc61FK+WgppZZSdux6lhaUUj5fSrmhlPLzUsr3SinbdT3TMCulHFFKubGUclMp5aSu52lBKWWXUsqiUsr1pZSlpZQTu56pJaWUmaWUa0opP+x6lskQrnUopeyS5HVJft31LA25IMk+tdb9kvwqyckdzzO0Sikzk5yR5Mgkeyd5Zyll726nasKqJB+tte6d5MAkx1u3TXJikmVdDzFZwrVuX0ry8SSeBNxItdaf1FpXrdm8IsncLucZcvsnuanWekut9bEkC5O8qeOZhl6t9a5a69Vrfv5Qet+Ed+52qjaUUuYmOSrJ17qeZbKEay1KKW9Kcket9bquZ2nY+5L8qOshhtjOSX7zpO3l8Q14k5RS5iV5RZIru52kGV9O7x/jE10PMlmzuh6gK6WUC5M8fy2/dGqSU9J7mJCnWd+61Vq/v2afU9N7SOdbm3M2po9SykiS7yT5cK31wa7nGXallKOT/K7WuqSUMtb1PJM1bcNVa33t2r5eStk3yYuTXFdKSXoPd11dStm/1nr3ZhxxKK1r3f6klHJMkqOTHF691mJ97kiyy5O25675GhtQStkivWh9q9b63a7nacQhSd5YSnl9kq2SPKeU8s+11nd1PFdfvI5rA0optyUZrbUO8xtTDoVSyhFJvpjksFrrPV3PM8xKKbPSu4Hl8PSCdVWSv661Lu10sCFXev+a/GaS+2qtH+56nhatueL6WK316K5n6ZfnuBikryTZJskFpZRrSyn/2PVAw2rNTSwnJPlxejcYfFu0NsohSd6d5DVr/o5du+YqgmnEFRcATXHFBUBThAuApggXAE0RLgCaIlwANEW4AGiKcAHQFOECoCn/H8z5lYwu5Tk+AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np \n",
    "import matplotlib.pyplot as plt \n",
    "w=2*v\n",
    "fig,axes=plt.subplots()\n",
    "fig.set_size_inches(7,7)\n",
    "v=np.array([2,1])\n",
    " \n",
    "axes.set_xlim(-5,5)\n",
    "axes.set_ylim(-5,5)\n",
    "axes.arrow(0,0,v[0],v[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "axes.arrow(0,0,w[0],w[1],head_length=0.1,head_width=0.1,color='red')\n",
    "axes.grid()\n",
    " \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2dc00234-d64a-49f4-8253-574977194e6a",
   "metadata": {},
   "source": [
    "The same approach is taken for scalar division.\n",
    "\n",
    "Try it for yourself - use the cell below to calculate a new vector named **b** based on the following definition:\n",
    "\n",
    "\\begin{equation}\\vec{b} = \\frac{\\vec{v}}{2}\\end{equation}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "940875bb-3ae1-466e-8c05-99af3b3eea04",
   "metadata": {},
   "source": [
    "## Dot Product Multiplication 点击（内积）\n",
    "向量（注意不是矩阵）的内积可以理解为一个与平面有 $ \\theta$ 夹角的力$ v $，与平面上的力$ u $ 的合力\n",
    "\n",
    "So we've seen how to multiply a vector by a scalar. How about multiplying two vectors together? There are actually two ways to do this depending** on whether you want the result to be a *scalar product* (in other words, a number) or a *vector product* (a vector).**\n",
    "> 使用内积，得到的是一个标量，其几何意义为 $ u \\cdot v=|u||v|cos\\theta $ 表示向量u在向量v方向上的投影长度乘向量v的模长。 如果v是单位向量，内积就可以直接描述为向量u在向量v方向上的投影长度\n",
    "\n",
    "To get a scalar product, we calculate the *dot product*. This takes a similar approach to multiplying a vector by a scalar, except that it multiplies each component pair of the vectors and sums the results. To indicate that we are performing a dot product operation, we use the &bull; operator:\n",
    "\n",
    "\\begin{equation} \\vec{v} \\cdot \\vec{s} = (v_{1} \\cdot s_{1}) + (v_{2} \\cdot s_{2}) ... + \\; (v_{n} \\cdot s_{n})\\end{equation}\n",
    "\n",
    "So for our vectors **v** (2,1) and **s** (-3,2), our calculation looks like this:\n",
    "\n",
    "\\begin{equation} \\vec{v} \\cdot \\vec{s} = (2 \\cdot -3) + (1 \\cdot 2) = -6 + 2 = -4\\end{equation}\n",
    "\n",
    "So the dot product, or scalar product, of **v** &bull; **s** is **-4**.\n",
    "\n",
    "In Python, you can use the *numpy.**dot*** function to calculate the dot product of two vector arrays:\n",
    ">很重要的一点是：向量A与向量B的点积 并不等于 向量B与向量A的点积，我们用A·B表示两个向量的点积运算，则A·B!=B·A\n",
    "\n",
    ">假如要计算 A·B，那么，A(点击号前面的向量)中x方向元素的数量应该于B(点积号后面的向量)中y方向的数量相同"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b38c3bc8-9656-42a0-b68d-0839fcc1fcfd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-19T08:14:33.920173Z",
     "iopub.status.busy": "2022-03-19T08:14:33.919743Z",
     "iopub.status.idle": "2022-03-19T08:14:33.927347Z",
     "shell.execute_reply": "2022-03-19T08:14:33.926711Z",
     "shell.execute_reply.started": "2022-03-19T08:14:33.920142Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "18\n",
      "18\n",
      "多维度向量内积结果 [[18 16]\n",
      " [12 20]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "import matplotlib.pyplot as plt  \n",
    "v=np.array([2,3,3])\n",
    "u=np.array([3,5,-1])\n",
    "s=np.dot(u,v)\n",
    "s1=np.dot(v,u)\n",
    "print(s)\n",
    "print(s1)\n",
    "# 内积也可以用@ 代替,以下为矩阵的内积\n",
    "v2=np.array([2,3,3,3,2,1]).reshape(2,3)\n",
    "u2=np.array([3,5,-1,3,5,-1]).reshape(3,2)\n",
    "print(\"多维度向量内积结果\", v2@u2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34088a65-1f76-464c-8e85-c368bf52baa9",
   "metadata": {},
   "source": [
    "### The Cosine Rule\n",
    "An useful property of vector dot product multiplication is that we can use it to calculate the cosine of the angle between two vectors. We could write the dot products as:\n",
    "\n",
    "$$ \\vec{v} \\cdot \\vec{s} = \\|\\vec{v} \\|\\|\\vec{s}\\| \\cos (\\theta) $$ \n",
    "\n",
    "Which we can rearrange as:\n",
    "\n",
    "$$ \\cos(\\theta) = \\frac{\\vec{v} \\cdot \\vec{s}}{\\|\\vec{v} \\|\\|\\vec{s}\\|} $$\n",
    "\n",
    "So for our vectors **v** (2,1) and **s** (-3,2), our calculation looks like this:\n",
    "\n",
    "$$ \\cos(\\theta) = \\frac{(2 \\cdot-3) + (-3 \\cdot 2)}{\\sqrt{2^{2} + 1^{2}} \\times \\sqrt{-3^{2} + 2^{2}}} $$\n",
    "\n",
    "So:\n",
    "\n",
    "$$\\cos(\\theta) = \\frac{-4}{8.0622577483}$$\n",
    "\n",
    "Which calculates to:\n",
    "\n",
    "$$\\cos(\\theta) = -0.496138938357 $$\n",
    "\n",
    "So:\n",
    "\n",
    "$$\\theta \\approx 119.74 $$\n",
    "\n",
    "Here's that calculation in Python:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "33cc47e3-d9f9-454e-bdeb-f9e62ebce70f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-19T08:24:49.392262Z",
     "iopub.status.busy": "2022-03-19T08:24:49.391779Z",
     "iopub.status.idle": "2022-03-19T08:24:49.399146Z",
     "shell.execute_reply": "2022-03-19T08:24:49.398614Z",
     "shell.execute_reply.started": "2022-03-19T08:24:49.392218Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.23606797749979 3.605551275463989\n",
      "2.0899424410414196\n",
      "角度为 119.74488129694222\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "u=np.array([2,1])\n",
    "v=np.array([-3,2])\n",
    "# 计算u，v 向量的范数\n",
    "u_norm=np.linalg.norm(u)\n",
    "v_norm=np.linalg.norm(v)\n",
    "print(u_norm,v_norm)\n",
    "u_v_dot=np.dot(u,v)\n",
    "#u_v_dot=|v||u|cos()\n",
    "cos_t=u_v_dot/(u_norm*v_norm)\n",
    "theta=np.arccos(cos_t)\n",
    "print(theta)\n",
    "print(\"角度为\",np.degrees(theta))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d79fa8d-4051-4467-9abb-7d1dfdeb893f",
   "metadata": {},
   "source": [
    "## Cross Product Multiplication 向量的外积（叉积）\n",
    "向量的外积cross得到的\n",
    "To get the *vector product* of multipying two vectors together, you must calculate the *cross product*. The result of this is a new vector that is at right angles to both the other vectors in 3D Euclidean space. This means that the cross-product only really makes sense when working with vectors that contain three components.\n",
    "\n",
    "For example, let's suppose we have the following vectors:\n",
    "\n",
    "\\begin{equation}\\vec{p} = \\begin{bmatrix}2 \\\\ 3 \\\\ 1 \\end{bmatrix}\\;\\; \\vec{q} = \\begin{bmatrix}1 \\\\ 2 \\\\ -2 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "To calculate the cross product of these vectors, written as **p** x **q**, we need to create a new vector (let's call it **r**) with three components (r<sub>1</sub>, r<sub>2</sub>, and r<sub>3</sub>). The values for these components are calculated like this:\n",
    "\n",
    "\\begin{equation}r_{1} = p_{2}q_{3} - p_{3}q_{2}\\end{equation}\n",
    "\\begin{equation}r_{2} = p_{3}q_{1} - p_{1}q_{3}\\end{equation}\n",
    "\\begin{equation}r_{3} = p_{1}q_{2} - p_{2}q_{1}\\end{equation}\n",
    "\n",
    "So in our case:\n",
    "\n",
    "\\begin{equation}\\vec{r} = \\vec{p} \\times \\vec{q} = \\begin{bmatrix}(3 \\cdot -2) - (1 \\cdot 2) \\\\ (1 \\cdot 1) - (2 \\cdot -2) \\\\ (2 \\cdot 2) - (3 \\cdot 1) \\end{bmatrix} = \\begin{bmatrix}-6 - 2 \\\\ 1 - -4 \\\\ 4 - 3 \\end{bmatrix} = \\begin{bmatrix}-8 \\\\ 5 \\\\ 1 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "In Python, you can use the *numpy.**cross*** function to calculate the cross product of two vector arrays:\n",
    "\n",
    "---\n",
    "在二维平面中，向量$v$ 与向量 $u$ 的cross运算法则为：\n",
    "$$ u\\times v =\\begin{bmatrix} u_1 \\\\ u_2 \\end{bmatrix} \\times \\begin{bmatrix}v_1\\\\v_2 \\end{bmatrix}=u_1v_2-u_2v_1 $$\n",
    "\n",
    "在二维平面中，向量的cross表示两个相连章草的平行四边形的“面积”，当然如果如果两个向量的夹角大于180，那么相连外积运算得到的结果为负数。\n",
    "\n",
    "在三维空间中，cross的结果也是有明确的物理含义的，即表示$u$ 和$v$ 两个向量张成平面的法向量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "bf0c66ad-244b-4167-98ab-7a1f3038cbcd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-19T09:15:04.369767Z",
     "iopub.status.busy": "2022-03-19T09:15:04.369031Z",
     "iopub.status.idle": "2022-03-19T09:15:04.375692Z",
     "shell.execute_reply": "2022-03-19T09:15:04.374901Z",
     "shell.execute_reply.started": "2022-03-19T09:15:04.369735Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7\n",
      "[ -1 -12   7]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "u=np.array([2,1])\n",
    "v=np.array([-3,2])\n",
    "u_v_cross=np.cross(u,v)\n",
    "print(u_v_cross)\n",
    "# 三维向量的外积\n",
    "u2=np.array([2,1,2])\n",
    "v2=np.array([-3,2,3])\n",
    "print(np.cross(u2,v2))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70caf819-7608-447c-83c8-92574a9c0557",
   "metadata": {},
   "source": [
    "## 线性相关\n",
    "当且仅当一组向量$ v_1,v_2,v_3...,v_n$ 中任一个向量可以表示为其他向量的线性组合时，称这组向量为线性相关的，否则是线性无关。\n",
    "\n",
    "应用零向量的概念，线性相关可以定义为：一组m-向量$v_1,v_2,..v_n$ 是线性相关的，当且仅当存在一组标量，$k_1,k_2...k_n$ （不全为0）使得：\n",
    "   $$ \\sum^{n}_{i=1}{k_iv_i}=0 $$\n",
    "  \n",
    "  另一方面，如果对所有的$i$，仅当$k_i=0$ 时，上述方程才成立，则这些向量是线性无关的。\n",
    " \n",
    " > 几何意义上，二维空间线性相关可以表示为两个线性无关向量$ v,u$ 的线性组合\n",
    " \n",
    " ## 向量空间\n",
    " \n",
    " 两个线性无关的向量 $ u,v$ 的各种线性组合生成的所有2维向量的全体称为2维向量空间。\n",
    " \n",
    " >张成空间:\n",
    " >进一步扩展，对于一组线性无关向量，由他们所有线性组合所构成的空间就称为这组向量所**张成** 的空间。\n",
    " \n",
    " >基：当一组线性无关向量张成了一个空间时，也可以说这一组向量构成了该空间的某一个**基** ,例如\n",
    " $$ e_1= \\begin{bmatrix} 1\\\\0\\\\0 \\end{bmatrix}, e_2=\\begin{bmatrix} 0\\\\1\\\\0 \\end{bmatrix},e_3=\\begin{bmatrix} 0\\\\0\\\\1 \\end{bmatrix}$$\n",
    " 就构成了三维空间$ R^3$ 的一个单位基向量。实际上，n-空间可以由全部线性无关的n个单位相连全体构成。\n",
    " \n",
    " * 如果二维空间两个向量 $v,u$ 线性相关，那么两个向量就在一条直线上。\n",
    " * 如果三维空间三个向量线性相关，$ v,u,w $ 也意味这有个向量可以被其他向量线性表达，例如 $ w=av+bu $ 那么3个向量构成了一个平面，或直接退化成一条直线。\n",
    " ### 基底\n",
    " \n",
    " 定义：全称是基底向量。不共线的向量e1、e2叫做这一平面内所有向量的一组基底。\n",
    " \n",
    " 例如默认情况下，$e_x=[1,0],e_y=[0,1]$就是默认的基底，向量$u=[5,6]$可以表示为基底的线性组合，或在基底向量上的投影。\n",
    " $$u=5 \\cdot \\begin{bmatrix} 1\\\\0 \\end{bmatrix}+ 6 \\cdot \\begin{bmatrix} 0\\\\1 \\end{bmatrix}$$\n",
    " \n",
    " 我们可以根据需要选择新的基底，例如$e_z=[1,1],e_w=[-1,-1]$，则之前的向量$u$可以用新的基底进行表达，即得到新的基底上的新坐标。\n",
    " \n",
    " 构成基底的条件：\n",
    " 1. 向量的数量足够，例如，三维空间的向量基底向量必须是3个。\n",
    " 2. 构成基底的向量必须线性无关，否则，线性相关的向量将会退化成$R^{m-n}$维度的空间。\n",
    " \n",
    " ### 张成空间\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4a4b6c73-9d94-48bf-86a0-01f40c36eeba",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-27T07:24:58.797632Z",
     "iopub.status.busy": "2022-03-27T07:24:58.796832Z",
     "iopub.status.idle": "2022-03-27T07:24:59.068153Z",
     "shell.execute_reply": "2022-03-27T07:24:59.067573Z",
     "shell.execute_reply.started": "2022-03-27T07:24:58.797598Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.patches.FancyArrow at 0x7feeaf3562d0>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAHLCAYAAADyY1AZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xl8VNX9//HXTSb7ngw7Vr4QBFkjBMFWrRsgLiB1xbVirVqt1orb91cV61q/lq9a69q68WihLVWxFRVEqEtRDIpfl5ZSCi6ImExWhiwzmfv742auQFaSezL3nHyej4ePKzOTk/PO505O5i7nWLZtI4QQQgj/SEp0B4QQQgixNxmchRBCCJ+RwVkIIYTwGRmchRBCCJ+RwVkIIYTwGRmchRBCCJ+RwVmIXmBZ1hOWZX1tWdZHezxWaFnWKsuyNrdsC9r52gtaXrPZsqwLeq/XQohEkcFZiN7xFHD8Po/dAKy2bXsksLrl33uxLKsQuAWYChwK3NLeIC6EMIcMzkL0Atu2Xwcq93l4DvB0y/8/DZzSxpfOBFbZtl1p23YVsIrWg7wQwjAyOAuROANs297R8v9fAQPaeM0Q4PM9/v1Fy2NCCIMFVDVcUVFhx6cGzcrKIhAIUFNTA0Bqaiq5ublUVFQAYFkWwWCQ6upqIpEIAAUFBTQ2NrJ7924AsrOzSU5OdttIS0sjJyfHbSMpKYmioiKqqqqIRqMAFBYWUl9fT319PQA5OTlYlkVtbS0A6enpZGVlEQqFAEhOTqawsJDKykqam5sBKCoqIhwO09DQAEBubi62bVNeXk56ejoZGRlkZGRQWel8KAoEAhQUFBAKhYjFYgAEg0Hq6upobGwEIC8vj+bmZnbt2gVAZmYmaWlpVFVVAZCSkkJ+fj4VFRXEf4bBYJDa2lqamprcNqLRKOFw2P0Zp6SkUF1d7f6M8/Ly3DbiP+Oamhq3jfz8fCKRyF5txOvU0NBAbm6u9nWqq6sDaFWnSCTC4MGDe7VOZWVlnHfeeUQiEbu6uprc3FxqamrsvLw8ysvLKS4upqKiwt6zTrfccguWZbF79+7bwuEw119/Pbm5uTQ1Nf3Pvu+nRYsWsXjxYgCampr4+9//rn2d2no/ZWZm0tzcrNX7ac86dfZ+ivdb9zq1936qqKggPT1d+zq1937q16+fhQcsVXNrl5eX2/369VPSth+Ul5cj+fSViHzbtm3jpJNO4qOPnGvCRo0axdq1axk0aBA7duzgqKOOYtOmTXt9zZIlS1i7di2PPvooAJdccglHHXUU8+bN6/B7lZSUsHHjRjVBEkz2Tb2Zng/wZHCWw9pCJMjs2bN5+mnnlPPTTz/NnDlzWr1m5syZrFy5kqqqKqqqqli5ciUzZ87s7a4KIXqZssE5GAyqatoXJJ/eejvfvHnzOOyww9i0aRNDhw7lt7/9LTfccAOrVq1i5MiRvPrqq9xwg3OxdllZGT/4wQ8A5xDlTTfdxJQpU5gyZQo333wzhYWFnX6/QEDZGauEk31Tb6bn84qyw9rxc2mmqqmpQfLpy/R8hxxyCO+//36iu6GE6bWTfNrz92Ht+Ml3U0k+vZmez+R12k2vneQTIOechRBCCN9RNjgbfthC8mnO9HzJycmJ7oIyptdO8glQODjH77kzleTTm+n5TD6sbXrtJJ8AhYNz/AZvU0k+vZmeLz4RhIlMr53kEyDnnIUQQgjfUTY4Z2VlqWraFySf3kzPl5Rk7t/dptdO8glQODinpKSoatoXJJ/eTM9nWZ7caulLptdO8glQODjHJyI3leTTm+n54gsYmMj02kk+AXLOWQghhPAdZYNzamqqqqZ9QfLpzfR8Jh/WNr12kk+Awrm1AXNvtBTC50pLSykrK0t0N4Toi/w9t3Z8oWpTST69mZ7P5IkeTK+d5BOgcHA2eYYikHy6Mz2fyUyvneQToHBwNvmcF0g+3Zmez2Sm107yCZBzzkIYSc45C5Ew/j7nXFNTo6ppX5B8ejM9n8n3OZteO8knQOHgbPqC2pJPb6bnM/m8num1k3wCZBISIYQQwneUDc75+fmqmvYFyac30/MlJycnugvKmF47ySdA4eAciURUNe0Lkk9vpucz+bC26bWTfAIUDs6mL6gt+fRmer5YLJboLihjeu0knwA55yyEEEL4jrLB2fQFtSWf3kzPl5Rk7t/dptdO8glQODgHAgFVTfuC5NOb6flMnoXJ9NpJPgEyCUm3ST69mZ5PJiHRl+QTIOechRBCCN9RNjibvqC25NOb6flMPqxteu0knwCFg3Nubq6qpn1B8unN9HwmT0Jieu0knwCFg7PpC2pLPr2Zni8ajSa6C8qYXjvJJ0DOOQshhBC+o2xwNvmcF0g+3Zmez2Sm107yCQBL4Ry85k7uK4TPlZaWUlZWluhuCNEXefLXh7JPztXV1aqa9gXJpzfT85l8n7PptZN8AmRVqm6TfHozPZ+sSqUvySdALggTQgghfEfZ4FxQUKCqaV+QfHozPZ/J9zmbXjvJJ0Dh4NzY2KiqaV+QfHozPZ/Jh7VNr53kE6BwcN69e7eqpn1B8unN9HyxWCzRXVDG9NpJPgFyzlkIIYTwHWWDc3Z2tqqmfUHy6c30fElJ5v7dbXrtJJ8AhYOzyRekgOTTnen5TJ6FyfTaST4BCgdn0xfUlnx6Mz2fyZOQmF47ySdAzjkLIYQQvqNscE5LS1PVtC9IPr2Zns/kw9qm107yCVA4OOfk5Khq2hckn95Mz2fyeT3Tayf5BCgcnE1fUFvy6c0P+TZt2kRJSYn7X25uLvfdd99er1m7di15eXnua37+8593qe1oNKqiy77gh9qpJPkEQCDRHRCirxo1ahQbN24EnAu4hgwZwty5c1u97ogjjuCvf/1rb3dPCJFAyj45m3yfJUg+3fkt3+rVqxkxYgQHHnhgorvie36rndcknwCFn5wzMjIoLy8HICsri0Ag4F5Cn5qaSm5urnt4w7IsgsEg1dXV7nJiBQUFNDY2ulO9ZWdnk5yc7LaRlpZGTk6O20ZSUhJFRUVUVVW5h/QKCwupr6+nvr4ecM51WJZFbW0tAOnp6WRlZREKhQDnPF1hYSGVlZXurShFRUWEw2EaGhoAyM3NxbZtYrEY5eXlZGRkkJGRQWVlpfMDDQQoKCggFAq5UygGg0Hq6urcOWXz8vJobm5m165dAGRmZpKWlkZVVRUAKSkp5OfnU1FR4c6RHAwGqa2tpampyW0jGo0SDofdn3FKSoq7Vmpqaip5eXluG/GfcU1NjdtGfn4+kUhkrzb2rFNNTY32daqrq3P3x33rBPimTk899RQnn3wyFRUVe9WpurqadevWMX78ePr378/ChQuZPHlym++nRYsWsXjxYgCqqqqMqVNb76fa2lrt3k9d/b2Xnp7u/u7UvU5tvZ/ivzt1r1N776d+/frhBUvVBPlVVVW2yauPVFVVGb26iuTrPU1NTQwePJiPP/6YAQMG7PVcbW0tSUlJZGdns2LFCq666io2b97caZuHHHII77//vqouJ5SfaqeC5NOeJ7dKKDu+YPIFKSD5dOenfC+99BKTJk1qNTCD84klPt3hCSecQCQS6dIFNSavSuWn2qkg+QTIJCRCJNySJUuYN29em8999dVX7kC7fv16YrEYRUVFvdk9IUQCKDvnXFhYqKppX5B8evNLvnA4zKpVq3j00Ufdxx555BEALr30UpYtW8bDDz9MIBAgIyODpUuXdmmCkfg5dRP5pXaqSD4BCs8579q1yzZ59ZFdu3YZvbqK5NPbpEmTeO+99xLdDSVMr53k056/zznHrxQ0leTTm+n54lfMmsj02kk+AXLOWQghhPAdmVu7mySf3kzPJ3Nr60vyCVA4OJu8Kg5IPt2Zns9kptdO8glQODjHZ6MxleTTm+n54jM9mcj02kk+AXLOWQghhPAdZYNzenq6qqZ9QfLpzfR8Ji8uYHrtJJ8AhYNzVlaWqqZ9QfLpzfR8Jg/OptdO8glQODjHVzwxleTTm+n5TJ6/2PTaST4Bcs5ZCCGE8B1lg7PJ91mC5NOd6flMZnrtJJ8AhXNrA+auWSeEz5WWllJWVpbobgjRF/l7bu3KykpVTfuC5NOb6flMPudseu0knwCFg7PJkyCA5NOd6flMZnrtJJ8AuSBMCCGE8B1l55xjsZht8r2WsVjM6HtJJZ/eTD7nbHrtJJ/2/H3OORwOq2raFySf3kzPZ/J6zqbXTvIJUDg4NzQ0qGraFySf3kzPZ/LgbHrtJJ8AOecshBBC+I6ywTk3N1dV074g+fRmej6TJ3owvXaST4DCwVnh5Ca+IPn0Zno+k3WndtXV1bzyyitaHO43fd80PZ9XlA3OdXV1qpr2BcmnN9PzmXwv6f7U7pNPPuHCCy9k0KBBnHzyybzzzjsKe+YN0/dN0/N5Rc45CyGM0tzczPPPP8+hhx5KaWkpixcvpqGhAcuyWLt2baK7J0SXKBucMzIyVDXtC5JPb6bnM/k+0vZqV1lZyV133cXAgQM577zzePfdd6mvr3ePIjQ1NbFixYre7Gq3mL5vmp7PKwFVDZteAMmnN9Pz9cXBecGCBTz55JMdfu2GDRtobm729QVzpu+bpufziix80U2ST2+m5+uLC1888MAD/OIXvyAvL4/MzMw2XxMIBPjwww9Vdq/HTN83Tc/nFXP/vBZC9CnZ2dlcd9117NixgzvuuIPCwsJWr4lEIvztb39LQO+E2D/KBudAQNkRc1+QfHozPZ9leTK9ry91VruMjAx+8pOfcOGFFwLQr18/srKyAGd2Kr+fdzZ93zQ9n1eULXwByM1sQiSIyQtfdIVt2yQlJXHyySfz5z//mcWLF3PTTTcRCoVITU2lpqbG6D9gREL5e+GLUCikqmlfkHx6Mz2fyeecu1K7K664AoA///nPpKSkMH/+fD777DOeeOIJ5s6d6+v7wE3fN03P5xVlxxd0mImnJySf3kzPZ7LOaheLxXjooYc455xzSElJcR9PTk7m7LPP5uyzz1bdxR4xfd80PZ9X5IIwIYRRLrjgAgCefvrpBPdEiO5Tds7Ztm3b5HM6tm0bfc5K8unN5HPOHdUuGo2SkpLCpZdeysMPP9zLPfOG6fum6fnw+zln0+dPlXx6Mz2fn8+p9lRHtTvttNMAeOihh3qrO54zfd80PZ9XlA3OjY2Nqpr2BcmnN9PzmbzyT3u1a2xsZPny5Vx33XVafzIzfd80PZ9X5JyzEMIIs2bNAuDuu+9OcE+E6Dllg3NeXp6qpn1B8unN9Hx+nju6p9qq3e7du1mzZg233Xab1p+awfx90/R8XlE2OJt8zgskn+5Mz2fyYe22avfd734XgJ/97Ge93R3Pmb5vmp7PK8oG5127dqlq2hckn95Mz2fyvaT71q62tpaysjLuu+++BPXIW6bvm6bn84qccxZCaG3KlCkAXHXVVQnuiRDeUTY4t7dkmykkn95Mz2fyes571i4UCvGvf/2L3/72twnskbdM3zdNz+cVZe/gtLQ0VU37guTTm+n5dL8oqiN71m78+PEAzJ8/P1Hd8Zzp+6bp+byibHCuqqpS1bQvSD69mZ5Pu4tubBueew6mTIF33unwpfHa7dixgx07drB06dLe6GGvMX3fND2fV8w99iWE0MPq1TBuHJx3HpSVwQMPdOnLRo4cCcCZZ56psndCJISyVan2XA3GRJJPb6bn0+Kw9vr1cOWV8OGHsHv3N48vXw6RCLRTo5SUFD799FPC4TAvvPBCL3W295i+b5qezyvKFr4AzL3RUggPDRs2jJycHJKTkwkEAq0WrLBtm6uuuooVK1aQmZnJU089xaRJkzps09cLX3zyCVx9NbzxBtTXt34+JweWLYMZM9ptIv7Hh8n3cwtt+Xvhi4qKClVN+4Lk05vf8q1Zs4aNGze2OaC+9NJLbN68mc2bN/PYY49x2WWXddpeNBpV0c2e27nTOYS9cmXbAzNAXR10sNxj/Gf06quvquhhwvlt3/Sa6fm8omxwNv0vWsmnN53yLV++nPPPPx/Lspg2bRrV1dXs2LEj0d3qnn79nAu/vvtdSEtz/mtL/NB2G+JzaB977LGqeplQOu2b3WF6Pq/IBWFCJJhlWcyYMYPJkyfz2GOPtXp++/btHHDAAe6/hw4dyvbt23uzi95JSoI5c2DtWtiyBf77v9t/3WuvtXr4ww8/BODvf/+7wk4KkXjKLgjLzMykvLwcgKysLAKBADU1NQCkpqaSm5vrHt6wLItgMEh1dTWRlr+WCwoKaGxsZHfLhSLZ2dkkJye7baSlpZGTk+O2kZSURFFREVVVVe4hvcLCQurr66lvOXyWk5ODZVnU1tYCkJ6eTlZWFqFQCHAWCygsLKSystK9FaWoqIhwOExDQwMAubm52LaNbduUl5eTkZFBRkYGlZWVzg80EKCgoIBQKOROoRgMBqmrq3OXSsvLy6O5udmdxi4zM5O0tDT3FoOUlBTy8/OpqKhw/8oMBoPU1tbS1NTkthGNRgmHw+7POCUlherqavdnnJeX57YR/xnX1NS4beTn5xOJRPZqI14n27apqanRvk7xtWP3rVN8YQg/1OnNN98kLS2Nr7/+mjPOOIPRo0czceJEtw3btmloaHDfT83NzUQiEfff8ffTokWLWLx4MeDcruL7OqWmknv99dh33UVddjYccwwZr75KRlMTlWlpsGQJgUMP3ev9dMwxxxAKhRg7dqybX4f305516uz9lJGR4WbzRZ3o/P20P7/34r87da9Te++nfv364QVlF4TV1NTYJq8+UlNTY/TqKpIvMRYuXEh2djYLFixwH7vkkks46qijmDdvHgCjRo1i7dq1DBo0qN12DjnkEN5//33l/e2xTz+FYcPggw9gwgSorITFi+G++yA313m8xfr165k6dSpvvfUW3/72txPXZ8X8um96xfR8+P2CsPhfKaaSfHrzS75wOOx+GgmHw6xcuZJx48bt9ZrZs2fzzDPPYNs2b7/9Nnl5eR0OzKDReb3p053thAnOtrAQrroK/vOfVpORTJ06Ffjm/mZT+WXfVMX0fF5RdlhbCNG5nTt3MnfuXMC5wvrss8/m+OOP55FHHgHg0ksv5YQTTmDFihUUFxeTmZnJk08+mcgueycWg82b4dZbWz9nWZCe7v7z9ddfB+CTTz7prd4JkVDKDms3NTXZqampStr2g6amJiSfvkzPN3nyZDZs2JDobnTs1lth4UJobnYuAOvAnvc1m147yac9fx/W9u19lh6RfHozPZ8Wh7UXLoRRozodmF9++WUAtmzZAphfO8knQOHgHL8SzlSST2+m54tfMetbGzc625UrO33prFmzCAQCDB8+HDC/dpJPgNznLIRIhPjV1t/6Vocve/bZZwHYtm2b4g4J4S/KBuesrCxVTfuC5NOb6fmSOjlUnFBNTc7Unb/5TacvPfXUUyksLGTIkCHuY6bXTvIJUDg4m77yiOTTm+n5fL0q1RVXONuLLurwZc888wwA//jHP/Z63PTaST4BCgfn+IwtppJ8ejM9X3ymJ196/HE4+uhOX3bBBRdw4IEH0r9//70eN712kk+AnHMWQvSm+EpSy5Z1+LKHH34YQI9ZzoRQQNngbPh9bJJPc6bn8+1h7fiMYIWFHb7sRz/6EePHj6egoKDVc6bXTvIJUDg4Gz53quTTnOn54gt7+ErLwgu8+GKHL7vnnnuA9leeMr12kk+AwsHZ9AW1JZ/eTM/ny4kezjrL2Z5wQrsvsW2b66+/nu985ztkZ2e3+RrTayf5BCgcnLWYoagHJJ/eTM/nSy+9BOed1+FLbr75ZgBWrVrV7mtMr53kE6BwcPbtOS+PSD69mZ7Pd373O2f72GPtvsS2bW6//XaOP/54MjIy2n2d6bWTfAIULnwByJ9HQiRIaWkpZWVlie7GNyzL+a+DaUV/8pOfcP/999PU1CT3wgqd+Xvhi5qaGlVN+4Lk05vp+Xx1n/OXXzrbfdZn3lMsFuP+++/njDPO6HRgNr12kk+AwsHZ9AW1JZ/eTM/nq/N68QvApkxp9yUXtcwW9vvf/77T5kyvneQTIJOQCCFUsm344AO44YZ2XxKNRnnqqaeYP3++P28BEyIBlA3O+fn5qpr2BcmnN9Pz+WaQu/deZ3v77e2+ZN68eQA8/vjjXWrS9NpJPgEKB+dIJKKqaV+QfHozPZ9vDmtfdx0MHQrt/LHQ1NTEsmXLuPrqq7u8kpbptZN8AhQOzqYvqC359GZ6vlgHV0X3mvhqUmvXtvuSk08+GYBf/vKXXW7W9NpJPgFyzlkIocoRRzjbESPafLq+vp6VK1dy8803y72vQuxD2eBs+oLakk9vpufr6iFiZaJRCIXgV79q9yXHHnssAAsXLtyvpk2vneQToHBwDgQCqpr2BcmnN9PzJfyT6IIFzvbyy9t8uq6ujnXr1nHvvffud19Nr53kEyCTkHSb5NOb6fkSPgnJ/ffD1KnOrGBtOOywwwC45ppr9rtp02sn+QTIOWchhNfefNPZvvBCm09XVVXx8ccf88gjj/Rip4TQi7LB2fQFtSWf3kzPl9DD2vELwfr3b/PpkpISAC655JJuNW967SSfAIWDc25urqqmfUHy6c30fAmbhCR+m8yyZW0+/fXXX/PZZ5+xePHibn8L02sn+QQoHJxNX1Bb8unN9HzRaDQx3/j733e2p57a5tOjRo0C4Nxzz+32tzC9dpJPgJxzFkJ4admydgfmzz//nOrqap599tle7pQQ+lE2OCf8Vg7FJJ/eTM+XEM8952yffrrNp4cNGwbA3Llze/RtTK+d5BOgcHAOBoOqmvYFyac30/Ml5F7S733P2bYxycSWLVuIxWK8/PLLPf42ptdO8glQODhXV1eratoXJJ/eTM/X6/c5l5c729dfb/Pp4uJiAGbOnNnjb2V67SSfAFmVqtskn95Mz9frq1LNmeNs47dR7eGTTz4B4PV2Bu79ZXrtJJ8AuSBMCNFTtg3r1sGVV7b59NixYwE4oo2BWwjRNmWDc0FBgaqmfUHy6c30fL16n/Ovf+1s21j2ccOGDQC8++67nn0702sn+QQoHJwbGxtVNe0Lkk9vpufr1cPaP/4xFBZCGxehlZaW7rX1gum1k3wCFA7Ou3fvVtW0L0g+vZmeLxaL9c432rLF2b7xRqun3nrrLQA+/PBDT7+l6bWTfALknLMQoieOOcbZjhnT6qnDDz8cgHHjxvVmj4QwgrLBOTs7W1XTviD59GZ6vqSkXvi7OxaDzz6DX/yi1VOrVq0C4F//+pfn39b02kk+AQoH54RNvN9LJJ/eTM/XK7Mw3XSTs7322lZPzZgxA4CRI0d6/m1Nr53kE6BwcDZ9QW3JpzfT8/XKJCR33gnjx8M+fwi80LKO86effqrk25peO8knQM45CyG6I35rVBvTcc6ZM4ecnBy+9a1v9XKnhDCHssE5LS1NVdO+IPn0Zno+5Ye1p01ztoMH7/XwkiVLADXnmuNMr53kE6BwcM7JyVHVtC9IPr2Znk/peb2GBudisMWLWz119tlnM3jwYAYOHKjs25teO8knQOHgbPqC2pJPb6bni0aj6hq/5BJne+65ez38+OOPA97f17wv02sn+QTIOWchxP565hk4/vhWD//whz9k9OjRFBYWJqBTQphF2eDcK/dZJpDk05sf8n3++eccffTRjBkzhrFjx3L//fe3es3atWvJy8ujpKSEkpISfv7znyegp3t46SVnu3TpXg//7//+LwDvvPOO8i74oXYqST4BYCmcg7eX16wTQi87duxgx44dTJo0ibq6OiZPnszzzz/PmD1m21q7di333nsvf/3rX/er7dLSUsrKyrzu8je3Te3ze8OyLKZMmcL69eu9/55C6MWTqzGV/QlTVVWlqmlfkHx680O+QYMGMWnSJMC5SObggw9m+/btnrSt5D7n+M+sZfavuPin+bVr13r/PdvsRuJrp5LkE6BwcFZ6QYoPSD69+S3ftm3beP/995k6dWqr59atW8fEiROZNWsWH3/8cZfaU3JE7PTTne1xx+31fW655RaOPfZYMjMzvf+ebfBb7bwm+QRA6zXePFJfX095eTkAWVlZBAIBd2aY1NRUcnNz3av2LMsiGAxSXV1NJBIBnDU/Gxsb3RVMsrOzSU5OdttIS0sjJyfHbSMpKYmioiKqqqrc4hcWFlJfX099fT3gfDqxLIva2loA0tPTycrKIhQKAc7tJ4WFhVRWVrqfPIqKigiHwzQ0NACQm5uLbdtUVlYCkJGRQUZGhvvvQCBAQUEBoVDIXRkoGAxSV1fnLpWWl5dHc3Mzu3btAiAzM5O0tDT3L8qUlBTy8/OpqKhwf8kGg0Fqa2tpampy24hGo4TDYfdnnJKSQnV1tfszzsvLc9uI/4xramrcNvLz84lEInu1Ea9TZWWlEXWqq6trs041NTX069fPF3VKTk5mzpw53Hrrre7Xxev0rW99i3//+9+kpaWxfPlyTj75ZD766KM230+LFi1iccvtTaFQyPs6rV1L/Q9/SH3L+zonJ4ebbrqJYDDIM888Q11dned1auv9ZNs2tbW1Wr2f9qxTZ++n3bt3u787dXk/7c/vvfjX6F6n9t5P/fr1wwvKzjk3NzfbJs+h2tzcbPQcsZKvd0QiEU466SRmzpzJT3/6005fP2zYMMrKyggGgx2+zvNzzk88ARddBI2NkJoKOINkUlISp5xyCs8995x336sTfqmdKpJPe/4+5xz/q81Ukk9vfshn2zYXXXQRBx98cLsD81dffeV+ili/fj2xWIyioqJO2/Z8PeeLLoL0dHdgBrik5X7nP/3pT95+r074oXYqST4Big9rm7w0mOTTmx/yvfXWWyxevJjx48dTUlICwJ133slnn30GwKWXXsqyZct4+OGHCQQCZGRksHTp0i5Nzenp4Pz558523Tr3oebmZh5//HHOP/98AgFlv0ba5IfaqST5BCgcnIUQHTv88MM7vXDriiuu4IorruilHrWjZflHWv6AADjvvPMAePLJJxPRIyGMJ3Nrd5Pk05vp+Tw7p2fb8M9/wi23uA9FIhGWLFnC5ZdfnpAJJUyvneQToHBw7pXF3hNI8unN9HyeufNOZ3vzze5Dc+fOBeAvXTsRAAAgAElEQVRXv/pVInpkfO0knwCFg3P8sn1TST69mZ7Ps0lIfvYzGDECWj4hNzQ08OKLL3LjjTcm7Jes6bWTfAJk4QshRHviq0utXu0+NHPmTADuuOOORPRIiD5D2eCcnp6uqmlfkHx6Mz2fJ+eCv/1tZ3vggQCEw2Fef/117rzzzoQemjS9dpJPgMLBOSsrS1XTviD59GZ6vh4Pzk1NsGsXPPaY+9Dhhx8OwI033tiztnvI9NpJPgEKB+f41HCmknx6Mz1fj+cvvuoqZ/uDHwBQXV3Nxo0bE3YR2J5Mr53kEyDnnIUQbXnkETjySHeJyNLSUoDE33MtRB+hbHA2fO5Uyac50/P1yJo1zvbZZwGoqKhgy5YtvplwxPTaST4BChe+AJQ1LIToWI8Wvohf7NXyu6F///6Ul5erWYZSCPP4e+GL+LJgppJ8ejM9X7fPObcsCchf/gLAl19+SXl5OX/84x896lnPmV47ySdA4eDs2SQIPiX59GZ6vm4791xne9JJAAwfPhyA008/PVE9asX02kk+AXJBmBBiTy+8AGefDcC2bdtobGzkxRdfTHCnhOh7lJ1zjsVidiImxe8tsVgsIZP+9xbJp7dunXNeuhTmzYPduyEjw51oxG/nmk2vneTTnr/POYfDYVVN+4Lk05vp+bq1nvO8ec42I4N//vOfALz22mse9sobptdO8glQODg3NDSoatoXJJ/eTM+334Pzjh3O9u23ATj44IMBOProo73slidMr53kEyDnnIUQ4F4AxtSpbNy4EYC3WwZqIUTvUzY45+bmqmraFySf3kzPt18TPdg2vPceLFgAwCGHHALA1KlTVXStx0yvneQToHBw9ttFJF6TfHozPd9+ue8+Z3v33e6n5finZz8yvXaST4DCwbkuPpmBoSSf3kzPt1/3kv70pzB4MCQnc9hhhwEwceJERT3rOdNrJ/kEyDlnIfq2TZuc7dq1rGmZUzt+pbYQInECqhrOyMhQ1bQvSD69mZ6vy/eRfve7znbkSI456CAARo0apahX3jC9dpJPgMJPzqYXQPLpzfR8XRqco1HYuRPuu48VK1YAsHXrVsU96znTayf5BMjCF90m+fRmer4uLXxxww3O9sorOfHEE0lLS2PYsGFK++UF02sn+QTIOWch+q5f/hJKS/nTsmUA/Oc//0lwh4QQccrOOQcCypr2BcmnN9PzxefFbte6dc72r3/ljIED6devH4MHD1bfMQ+YXjvJJ0DhJ+eCggJVTfuC5NOb6fk6nYTk298G4MmWc82ffPKJ6i55xvTaST4BCgfnUCikqmlfkHx6Mz1fh+ecd+92tn/6E/Pnz2f48OEEg8He6ZgHTK+d5BOgcHDu1qo4GpF8ejM9X4cuugiAB7/6CoANGzYksjf7zfTaST4BckGYEH3P0qVwyin8+Mc/pqSkhPz8/ET3SAixD2WDs06HybpD8unN9HztXnSzfDkAd7VMz/nmm2/2Vpc8Y3rtJJ8AmVu72ySf3kzP1+7c2qecgg389623cuSRR5KVldWr/fKC6bWTfAIUDs6NjY2qmvYFyac30/O1ufJPRQUA/++ccwB45ZVXerNLnjG9dpJPgJxzFqLv+N73sIG7fvc7TjzxRNLT0xPdIyFEO5QNznl5eaqa9gXJpzfT87W6z9m24Y03+PG4cQA899xzCeiVN0yvneQToHBw3q/1ZDUk+fRmer5Wh7UffZQY8OuPPmLevHmkpKS0+pqYHWNX067e6WAPmF47ySdA4eC8a5f/3+Q9Ifn0Znq+VveSXnYZF7YMyIsXL27za558/0ly78ql+IFifviXH7LkwyV8VvOZ6q7uN9NrJ/kEKJxbWwjhE1u3EgWeiUS4+OKL253ac2bxTFKSU9hStYUtVVtY+tFSIrEIGYEMpg2dxswRMznpoJMYUTiid/svRB+k7JNzZmamqqZ9QfLpzfR8e63nfOyxnN7yv48++mi7XzM0dygXllxIanIqAHVNdTREG6hqqOKlf7/Etauu5fznz1fY664xvXaST4DCwTktLU1V074g+fRmej53VapYjMatW3keWLBgQaerVS08aiHJVtufrFOTU5lfMt/jnu4/02sn+QQoHJyrqqpUNe0Lkk9vpudzL7pZuJATWx675557Ov26gdkD+X7J90lJan3BWCApwLkTzvWwl91jeu0knwA55yyE0XbfdhurgVtvvbXTT82h3SGmPD6FrdVbWz2XHkjnJ9N+QlpAPvUI0RuUDc5t3aphEsmnN9PzWZYF77/PUS3/vvnmm9t97Y66HUx4ZAIVu50ZxB476TH+XflvHlj/AA3RBvd1Pz70xwp73HWm107yCVA4OJu+0o3k05vp+ZKTk6mdOpV3gUWLFrX5mk+rP2XUg6NobHamU/z9937PvPHzAKiqr+LX7/4agIAVYN64eRRlFvVK3ztjeu0knwCF55wrWubxNZXk05vp+aKRCIdGIgBcffXVez23ObQZ61aLYfcPo7G5keVnLce+xXYHZoCCjAIWfHsB6YF0AskBbjz8xl7tf0dMr53kE6BwcG5z4n2DSD69mZ6veft2NgGPPfaY+9iHOz/EutXioAcPAmDluSuxb7GZPWp2m21cc9g1JFvJfOeA7zCyaGRvdLtLTK+d5BMgC18IkXAvv/wyo0aNori4mLvvvrvV842NjZx55pkUFxczdepUtm3b1mmb/66pAeDiiy/m3e3vYt1qMeGRCQC8eeGb2LfYTB8xvcM2ctJyeOPCN3hyzpP7H0oI0SOWqr9ibNu2O7s6VGe2bXd69avOJF/vaG5u5qCDDmLVqlUMHTqUKVOmsGTJEsaMGeO+5qGHHuL//u//eOSRR1i6dCnPPfccf/jDH9pt86ulSxk0bx433XMtt+3+H/fxsovLmDx4stI8vcEvtVNF8mnPk3DKPjnX1taqatoXJJ/e/JJv/fr1FBcXM3z4cFJTUznrrLNYvnz5Xq9Zvnw5F1xwAQCnnXYaq1ev7vDQYPHZ80hKSnIH5o8u+wj7FtuIgRn8UztVJJ8AhZ+cR40aZWdkZADOVIKWZbkTI1iWRXJyMtFo1H19IBCgubnZ/aWTnJyMbdvuBP7daSMQCBCLxdw24nMKx9tISkoiKSmpVRv7/rutNnbu3EkwGGzVRm9lU91GRUUF/fr1075O7bVRUVHBwIEDE16nmpoadu3axZAhQwBngob6+nqGDBnitrFp0yaKi4vdTP/4xz8YPXq0++kj3o+dO3dSURGisbEBG5sx48a4k4noWqe2+hUKhQgGg1q9n/anjfjvFt3r1N7P5+uvv3Z/d+pcp/ba+OCDDz62bXscPWXbtpL/Jk6caJtM8unNL/n+9Kc/2RdddJH772eeeca+/PLL93rN2LFj7c8//9z99/Dhw+3y8vI225s507bBtjMyMtR02Af8UjtVJJ/egDLbgzFU2WHt9la+MYXk05tf8g0ZMoTPP//c/fcXX3zhfopu6zXRaJSamhqKitq+5/iVV+D7399jbm0D+aV2qkg+AXIrVbdJPr35Jd+UKVPYvHkzW7dupampiaVLlzJ79t63Ns2ePZunn34agGXLlnHMMce0OfjGl2l+5BH/5FPB5Gwg+YRD2Qxh55xzjqqmfUHy6c0v+QKBAA8++CAzZ86kubmZ+fPnM3bsWG6++WZKS0uZPXs2F110Eeeddx7FxcUUFhaydOnSNts6/3xISYG0NNr9ZG0Cv9ROFcmnvcc6f0nnlF0QVl5ebvfr109J235QXl6O5NOXafm++AIOOAA2bIBJk6CkpISNGzcmultKmFa7fUk+7fn7VqqsrCxVTfuC5NObafmOP97ZTprkbJOSzJ1fyLTa7UvyCVA4OJu+8ojk05tJ+WwbPv4Yfvazbx4z+YIwk2rXFsknoIeDs2VZp1uW9bFlWTHLskr3fO7WW2+luLiYUaNG8corr7T59Vu3bmXq1KkUFxdz5pln0tTU1JPuKHXmmWdSUlJCSUkJw4YN45BDDmnzdcOGDWP8+PGUlJRQWlra5mv8aOHChQwZMsTNuGzZsjZf19lUk3517bXXMnr0aCZMmMDcuXP59NNP23ydTvWL1yIYLAbu5tZbv3muubm5W9N++sXnn3/O0UcfzZgxYxg7diz333+/+1x1dTUAa9euJS8vz91nf/7znyequ93S3r4Wz2fbNldeeSXFxcVMmDCB9957L1Fd3W+bNm1y61JSUkJubi733XcfoG/95s+fT//+/Rk37ptbmCsrK5k+fTojR45k+vTpVFVVtfm1lmVdYFnW5pb/LujSN+zJfVjAwcAoYC1QusfjY8aMGWM3NDTY//nPf+zhw4fb0Wi01f1gp59+ur1kyRLbtm37kksusR966CEvbjNT7qc//al93XXXtfncgQce2O49qH52yy232P/zP//j/vvrr79u9ZpoNGoPHz7c3rJli93Y2GhPmDDB/vjjj3uzm932yiuv2JFIxLZt277uuuvsK664os3X6VK/PWsBjXZKyt61mDhxov3rX//avuSSS2zbtu0lS5bYZ5xxRqK6u9++/PJLe8OGDbZt23Ztba09cuRIN19831yzZo194oknJqyPPdXevhbP9+KLL9rHH3+8HYvF7HXr1tmHHnpob3fRE9Fo1B4wYIC9bds227b1rd/f/vY3e8OGDfbYsWPdx6699lr7rrvusm3btu+66674uLDvOFkI/KdlW9Dy/wX7vm7f/3r0ydm27X/Ytr2pjafmnHbaaaSlpfFf//VfFBcXs379+lZ/FLz22mucdtppAFxwwQU8//zzPelOr7Btmz/+8Y+ceeaZie6KUqmpqa0e68pUk341Y8YMAgHn5oRp06axc+fOBPeoZ+K1qK8fDqRy1VV718KyrP2e9tNPBg0axKSWE+g5OTkcfPDBbN++HWh73zRJPN/y5cs5//zzsSyLadOmUV1dzY4dOxLcu/23evVqRowYwYEHHgjoW78jjzySwsLCvR7b8z3WwRg2E1hl23albdtVwCrg+M6+n6pzzkNGjvxmibmhQ4e6b6y4UChEfn6++wuzrdf40RtvvMGAAQPcXxz7siyLGTNmMHny5L2W69PBgw8+yIQJE5g/f747Ld2etm/fzgEHHOD+W5ea7euJJ55odS9xnC71i9fiiCOcf0+YsHctkpOT96pXIBAgLy+PUCiUiO72yLZt23j//feZOnUqAHl5ee5z69atY+LEicyaNYuPP/44UV3slvb2tXg+U95vS5cuZd68b9YKN6V+4EzjPGjQIAAGDhzY3h/9Q4DP9/j3Fy2PdajT+5wty3oVGNjGU//Ptu12PzbV1dV11rTvHHfccXz11VetHr/jjjuYM2cOAEuWLGHevHlUVFS489/u6c0332TIkCF8/fXXTJ8+ndGjR3PkkUcq73tXdJTvsssu46abbsKyLG666SYuv/xyfv/73yegl93XlfrdcccdBAIBZs6c2WYbfq7fvmIxqKqChx9u/dye8wLrbNeuXZx66qncd9995ObmArjvvUmTJvHpp5+SnZ3NihUrOOWUU9i8eXOCe9x17e1r7f1u0VFTUxMvvPACd911l/uYKfXbl2VZnl6I2engbNv2cd1od/uef+G1NSVhUVER1dXVRKNRAoFAm6/pba+++mqHz0ejUZ599lk2bNjQ7uHBeIb+/fszd+5c1q9f75tf7p3l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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 线性相关 线性无关的几何表达。\n",
    "###  \n",
    "import numpy as np \n",
    "import matplotlib.pyplot as plt\n",
    "#二维空间，线性相关的向量 \n",
    "u=np.array([2,5])\n",
    "u2=np.array([3,6])\n",
    "v=-1.5*u # v为u的线性表达\n",
    "w=0.75*v+u2\n",
    "fig3,axes3=plt.subplots()\n",
    "fig3.set_size_inches(8,8)\n",
    "axes3.set_xlim(-10,10)\n",
    "axes3.set_ylim(-10,10)\n",
    " \n",
    "axes3.spines['top'].set_visible(False)\n",
    "axes3.spines['right'].set_visible(False)\n",
    "axes3.spines['left'].set_position(('data',0))\n",
    "axes3.spines['bottom'].set_position(('data',0))\n",
    "# 为图像添加网格\n",
    "axes3.grid(color='gray',linestyle='--',alpha=0.2)\n",
    " \n",
    "\n",
    "axes3.arrow(0,0,v[0],v[1],head_length=0.3,head_width=0.5,color='blue',shape='full')\n",
    "axes3.arrow(0,0,u[0],u[1],head_length=0.3,head_width=0.5,color='red',shape='full')\n",
    "axes3.arrow(0,0,w[0],w[1],head_length=0.3,head_width=0.5,color='green',shape='full')\n",
    "axes3.arrow(0,0,u2[0],u2[1],head_length=0.3,head_width=0.5,color='black',shape='full')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "0931080b-e606-456e-8934-d78aa8d5f191",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-27T07:28:27.667205Z",
     "iopub.status.busy": "2022-03-27T07:28:27.666417Z",
     "iopub.status.idle": "2022-03-27T07:28:28.130144Z",
     "shell.execute_reply": "2022-03-27T07:28:28.129274Z",
     "shell.execute_reply.started": "2022-03-27T07:28:27.667166Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "u 向量是否是e_x,e_y两个基底的线性组合： [ True  True]\n",
      "新的坐标上u的投影（cos） 9\n",
      "1\n",
      "新的基地构成的二维坐标矩阵： [[ 1  1]\n",
      " [-1  1]]\n",
      "向量u通过与新的二维坐标矩阵内积得到新的坐标下的投影： [9 1]\n"
     ]
    },
    {
     "data": {
      "image/png": "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/iP50IeSJUtapwEAYIEa+AxprfWaWuvFq9d/m+SyJLsMul1gTP3618lhhyWPfnRyxBGt0wAAsIAN4wzpfyml7J7ksUn+6IaxUsrSJEuTZGpqKrOzs8Pc9XrNzc3N+z5bMM5+GctxXnRRcuKJyV57JRuYfSzHuQmMEwDgroZWSEspWyf5VJLX1lpv+sPv11qXJVmWJNPT03VmZmZYu94gs7Ozme99tmCc/TJ243ze85JPfSq58spkt902+LeN3Tg3kXECANzVUJ6yW0rZLF0ZPaXWevowtgmMmS9+sSujy5ZtVBkFAGByDeMpuyXJB5NcVms9afBIwNi56abk4IOThz40+fM/b50GAIAxMYwzpPsleWmSA0op31793yFD2C4wLu5zn2552WVtcwAAMFYGvoe01vq1JD5kECbVS17SLX/6U583CgDARhnKPaTAhPryl5P/+3+T978/2X331mkAABgzCimwaebmkoMO6oroX/5l6zQAAIwhhRTYNNts0y1//OO2OQAAGFsKKbDxjjyyW/74x8k9/DMCAMCm8ZMksHHOOSf58IeTd70r2WOP1mkAABhjCimw4W6+OZmZSXbeOTnqqNZpAAAYcwopsOG23rpbXnVV2xwAAPSCQgpsmP/5P7vlD36QLFrUNgsAAL2gkALrd+65ybJlyT/+Y/KQh7ROAwBATyikwN373e+SJz4x2W675I1vbJ0GgB65447kuOOSj30sueWW1mn6Y/ny5B/+ITn11NZJYP0UUuDubbllt7zuurY5AOil970vOeKIZIcdkuc/P/nKV1onGk+/+13ywQ8me++dPOhByfHHJ2ee2ToVrJ9CCqzba17TLS+91H2jAAzdokXJYYclt97aFapPfCJ5+tO7M6dsnHPOSf78z5NvfjO57bZkq62SF72odSpYP4UUWLsLLujetn7rW5OHP7x1GgB66kUvSrbZZs3Xp5ziPdBN8dSnJk95ypqvV6xIDjigXR7YUAop8MduvTXZd9/u7dXjjmudBoAeO/DArjzd857d1895TlJr20zjaPny5Itf7NYXLUr233/NnMJCtrh1AGAB2mKLbvnrX7fNAUDvbbFFcswxydRUctBBycMe1t1PesMNrZONjxtvTO5//2791luTV74y+bM/a5sJNpRCCtzV0Ud3y+99L1nsnwgARu/v/m7N+gUXJPvsk0xPd/dDcvduuSXZfvtufcWKZLPNko98pG0m2Bgu2QXWuOii5KSTkre8Jdlzz9ZpAJhAj3tc8oUvdIekZz+7dZqF7fbbu7trkuTmm7syCuNGIQU6K1Z0b0cvWpT87//dOg0AE+ypT00++tHkM59Z88B37qrWZPPNu/UbbljzKW0wblyPB3TufPLB737XNgcAJHnJS5Jf/rK7k2TJkuTYY1snWjhqTe6x+rTSlVcm971v2zwwCIUUWHOU/9a3XO8DwILx+tcnP/9598D3nXZKjjyydaKFYcmSbnnJJcluu7XNAoNSSGGB+uDFH8xOt+80+h19+9vJCSd0pfQxjxn9/gBgI5x4YnL11ckrXtE9ffeww1onamvffZNf/CI577zkEY9onQYG5x5SWIBWrlqZo75wVK757TWj3dHttyePfWy3/ra3jXZfALCJTj012W+/5BnPSM49t3Wadp7//O4pxGeckTz+8a3TwHAopLAAnXvluVlVV+W3K36bFXesGN2O7nwCwm23jW4fADAEX/tasssuyROf2F2qOmle97rkE59IPvzh5OlPb50GhkchhQXo45d8PLfd0ZXEc644ZzQ7+du/TVau7D7k7c7H9AHAAnbVVd1yzz27h/lMire/PXnXu5J/+Ifk5S9vnQaGSyGFBabWmk9e+smsqquyqq7Kad8/bfg7+f73u08hf/3rk732Gv72AWAESklWrerWH/CA7uNO+u7f/i055pjkqKO6JfSNQgoLzKq6Ko+aetR/fb3k3kuGu4OVK5NHrd7+O94x3G0DwIiV0j0CIekecnTzzW3zjNKZZ3ZnRJ/3vO4MKfSRQgoLzKJ7LMrZLzs7SXLve947f7//3w93B9tu2y193igAY2rx4uSWW7r1rbdeU1D75Pzzk0MOSR73uO7eUegrhRQmyVvf2r2VfP75yb3u1ToNAGyyLbZIbryxW9988zWX8vbBZZd1T9HdccfuqbrQZwopTIrLLkv+5m+SV7862Wef1mkAYGDbbZcsX96tL1qU1No2zzAsX77m80V/+cu2WWA+KKQwCe64Y83R7b3vbZsFAIZol12691yT5H73a5tlUDfemOy2W7d+xx3d/bLQdwopTII7j9B33nADAD3ysId1d6Ncf32y996t02yaW25Jtt++W1+xIrmHn9KZEP6oQ9+9/e3dW65f+1p3ww0A9NA++3RPpf3mN5PnPrd1mo2zcmWy1Vbd+s03J5tt1jYPzCeFFPrshz/sPrRs6dJkv/1apwGAkTr44OQjH0lOPz35679unWbD1LqmgF5/fbLllm3zwHxb3DoAMCJ33JE89KHd+j/9U9ssADBPDj88ufba5Oijk513To49tnWidat1zaW5V1655pJdmCQKKfTVnU9FmJtrmwMA5tnrX5/8/OfJccclO+2UHHlk60Rrt+uu3fKSS9YctmHSKKTQR+96V3LNNcns7JqbUgBggpx4YnL11ckrXtF9nuehh7ZOdFdPeEJXms87b82D8GESuYcU+ubHP05e97rkiCOSJz+5dRoAaObUU7vid9hhXfFbKF7wguTrX08+97nk8Y9vnQbaUkihT1atSh70oG79Qx9qmwUAFoBzz02WLOme7XfJJa3TdPe2fvzj3WF6oZ21hRYUUuiT//bfuuVvf9s2BwAsIMuXd8s990yuuqpdjhNPTE46KTnhhO5CJkAhhf54//uTK65Izj472Xrr1mkAYMEopbuIKEnuf//khhvmP8O//Vvyxjd2H0fzpjfN//5hoVJIoQ+uuCJ59auTF784OfDA1mkAYMEpJbn99m59hx2Sm2+ev32feWby8pcnz3lO8u53z99+YRwopDDuak0e+MBu/ZRT2mYBgAVs8eLkllu69a23XlNQR+mCC5JDDkmmp5NPfWr0+4Nxo5DCuHv4w7vlb37TNgcAjIEttkhuvLFb33zzNZfyjsLllyf77tudkb3wwtHtB8aZQgrj7J//OfnBD7prge5979ZpAGAsbLfdmgcdLVrUXWw0bFdfveY942uvHf72oS8UUhhXV12VLF2aPPvZycEHt04DAGNll12Syy7r1qemhrvtX/0q2XXXbv2OO7r7V4G1U0hhHNXaPSYwSU4/vW0WABhTD3tYcv75yXXXJXvvPZxt/u53yX3v262vWJHcw0/bcLf8FYFx9JjHdMtf/aptDgAYc/vsk3z+88k3v5k897mDbWvlymTLLbv1ublks80Gzwd9p5DCuPnwh5Pvfjc544xk221bpwGAsfe0p3WfE3r66clRR23aNmpdU0Cvvz7Zaqvh5YM+W9w6ALARfv7z5Mgjk6c/vfsPABiKl760e/jQG96QLFmSvOlNG/57a11zae6VVybbbz+ajNBHCimMi1q7JzAk3dlRAGCojj66e+/3zW/uHnR0xBEb9vt2261bfv/7a9aBDaOQwrjYd99uecMNbXMAQI+94x3dR8IceWT3+aGHHnr3r99vv+4jXs49N3nkI+cnI/SJe0hhHJxySvKNbySf/vSaR/cBACPxsY8lj398cthhyXnnrft1L3xh9/3PfS55whPmLx/0iUIKC90vfpEcfnhy0EHJs57VOg0ATITzzkt23rk7A3rppX/8/Te8oSuuJ5+8/rOowLoNpZCWUg4upfyglPKjUsqbh7FNYLWdd+6WX/pS2xzAWHFshsFdfXW3fOQjk6uuWvPrJ53UXdr7trd1l/YCm27gQlpKWZTk/UmeluQRSV5USnnEoNsFkt1+fnO3cu21SSkj398ZPzgjb/nKW/LjG3888n0Bo+PYDMNRSrJqVbd+//t3j3G48cbu4UeveU1y7LFt80EfDOOhRo9L8qNa60+SpJRyWpJnJlnLxQ3Ahnr+95N77XtHvvWe4/LL31yU/Gb0+3z9l16fn/zqJ3n7eW/PHtvtkb/Y6y9y+J8cnu222G70OweGybEZhqSU5Pbbu88Y3WGH5MQTk+c8J3nPe1ong34otdbBNlDK85IcXGt95eqvX5pkn1rrq//gdUuTLE2SqampvU477bSB9rux5ubmsvXWW8/rPlswzv647meXZvFW2+cnty9vmmOP7fbIdvcabSGdhP+fiXGO0v77739RrXV6Xne6gI3LsXljTcrfoVEyh5tu1aruY12WLJnLDjuYw0H4czi4cZjDDT02z9vHvtRalyVZliTT09N1ZmZmvnadJJmdnc1877MF4+yTmczOzubomRfM2x6fceozcuaPzsyOW+6YP3vsn+Vlj35ZHrz9g0e+38n4/2mcLDytj80by5+twZnDwRxwgDkcBnM4uD7N4TAK6dVJfv8jgHdd/WvAmPnAoR/I8puWZ+8le6fMwz2rwMg4NgMwFoZRSC9M8uBSygPTHexemOTFQ9guMM+WbLMkS7ZZ0joGMDjHZgDGwsCFtNa6spTy6iRfTLIoycm11ksGTgYAbBLHZgDGxVDuIa21fj7J54exLQBgcI7NAIyDgT+HFAAAADaFQgoAAEATCikAAABNKKQAAAA0oZACAADQhEIKAABAEwopAAAATSikAAAANKGQAgAA0IRCCgAAQBMKKQAAAE0opAAAADShkAIAANCEQgoAAEATCikAAABNKKQAAAA0oZACAADQhEIKAABAEwopAAAATSikAAAANKGQAgAA0IRCCgAAQBMKKQAAAE0opAAAADShkAIAANCEQgoAAEATCikAAABNKKQAAAA0oZACAADQhEIKAABAEwopAAAATSikAAAANKGQAgAA0IRCCgAAQBMKKQAAAE0opAAAADShkAIAANCEQgoAAEATCikAAABNKKQAAAA0oZACAADQhEIKAABAEwopAAAATSikAAAANKGQAgAA0IRCCgAAQBMKKQAAAE0opAAAADShkAIAANCEQgoAAEATCikAAABNKKQAAAA0oZACAADQxECFtJTy9lLK5aWU75ZSPl1K2XZYwQAAAOi3Qc+QnpVkz1rrnyT5YZJjB48EAADAJBiokNZav1RrXbn6y/OT7Dp4JAAAACbB4iFu6xVJPraub5ZSliZZmiRTU1OZnZ0d4q7Xb25ubt732YJx9otx9otxAgDc1XoLaSnl7CQ7reVbx9daP7v6NccnWZnklHVtp9a6LMmyJJmenq4zMzObkneTzc7OZr732YJx9otx9otxAgDc1XoLaa31oLv7finliCSHJjmw1lqHlAsAAICeG+iS3VLKwUmOSfLkWustw4kEAADAJBj0KbvvS7JNkrNKKd8upXxgCJkAAACYAAOdIa21PmhYQQAAAJgsg54hBQAAgE2ikAIAANCEQgoAAEATCikAAABNKKQAAAA0oZACAADQhEIKAABAEwopAAAATSikAAAANKGQAgAA0IRCCgAAQBMKKQAAAE0opAAAADShkAIAANCEQgoAAEATCikAAABNKKQA0COllLeXUi4vpXy3lPLpUsq2rTMBwLoopADQL2cl2bPW+idJfpjk2MZ5AGCdFFIA6JFa65dqrStXf3l+kl1b5gGAu7O4dQAAYGRekeRj6/pmKWVpkqVJMjU1ldnZ2XmKtWnm5uYWfMaFzhwOzhwOzhwOrk9zqJACwJgppZydZKe1fOv4WutnV7/m+CQrk5yyru3UWpclWZYk09PTdWZmZvhhh2h2djYLPeNCZw4HZw4HZw4H16c5VEgBYMzUWg+6u++XUo5IcmiSA2utdV5CAcAmUEgBoEdKKQcnOSbJk2utt7TOAwB3x0ONAKBf3pdkmyRnlVK+XUr5QOtAALAuzpACQI/UWh/UOgMAbChnSAEAAGhCIQUAAKAJhRQAAIAmFFIAAACaUEgBAABoQiEF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\n",
      "text/plain": [
       "<Figure size 1152x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#基底表达\n",
    "# 默认情况下，e1=[1,0],e2=\n",
    "import numpy as np \n",
    "import matplotlib.pyplot as plt \n",
    "fig,axes=plt.subplots(1,2)\n",
    "fig.set_size_inches(16,8)\n",
    "u=np.array([4,5])\n",
    "ax1=axes[0]\n",
    "ax2=axes[1]\n",
    "e_x=np.array([1,0])\n",
    "e_y=np.array([0,1])\n",
    "ax1.set_xlim(-7,7)\n",
    "ax1.set_ylim(-7,7)\n",
    "ax1.grid()\n",
    "ax1.arrow(0,0,e_x[0],e_x[1],head_width=0.1,color='green')\n",
    "ax1.arrow(0,0,e_y[0],e_y[1],head_width=0.1,color='green')\n",
    "ax1.arrow(0,0,u[0],u[1],head_length=0.1,head_width=0.1,color='red')\n",
    "#新的基底\n",
    "ax2.set_xlim(-5,5)\n",
    "ax2.set_ylim(-5,5)\n",
    "ax2.grid()\n",
    "e_z=np.array([1 ,1])\n",
    "e_w=np.array([-1  ,1])\n",
    "ax2.arrow(0,0,e_z[0],e_z[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "ax2.arrow(0,0,e_w[0],e_w[1],head_length=0.1,head_width=0.1,color='blue')\n",
    "# 向量u是基底的线性组合\n",
    "u=np.array([4,5])\n",
    "u2=4*e_x+5*e_y\n",
    "print(\"u 向量是否是e_x,e_y两个基底的线性组合：\",u2==u)\n",
    "print(\"新的坐标上u的投影（cos）\",u@e_z)\n",
    "print(u@e_w)\n",
    "# 定义相关的坐标系\n",
    "new=np.array([e_z,e_w])\n",
    "print(\"新的基地构成的二维坐标矩阵：\",new)\n",
    "new_point=new@u\n",
    "print(\"向量u通过与新的二维坐标矩阵内积得到新的坐标下的投影：\",new_point)\n",
    "\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14b2a82a-0a0d-4f45-a6bd-ddcc6c121091",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "e4aae7d0-cf57-4b7c-8824-23e3334306d5",
   "metadata": {},
   "source": [
    "# 矩阵\n",
    "\n",
    "## Introduction to Matrices\n",
    "In general terms, a matrix is an array of numbers that are arranged into rows and columns.\n",
    "\n",
    "## Matrices and Matrix Notation\n",
    "A matrix arranges numbers into rows and columns, like this:\n",
    "\n",
    "\\begin{equation}A = \\begin{bmatrix}\n",
    "  1 & 2 & 3 \\\\\n",
    "  4 & 5 & 6\n",
    " \\end{bmatrix}\n",
    "\\end{equation}\n",
    "\n",
    "Note that matrices are generally named as a capital letter. We refer to the *elements* of the matrix using the lower case equivalent with a subscript row and column indicator, like this:\n",
    "\n",
    "\\begin{equation}A = \\begin{bmatrix}\n",
    "  a_{1,1} & a_{1,2} & a_{1,3} \\\\\n",
    "  a_{2,1} & a_{2,2} & a_{2,3}\n",
    " \\end{bmatrix}\n",
    "\\end{equation}\n",
    "\n",
    "In Python, you can define a matrix as a 2-dimensional *numpy.**array***, like this:\n",
    "python 中可以用两种方式表示矩阵， \n",
    "\n",
    "```pyhton \n",
    "m=np.matrix([[]])\n",
    "m=np.array([[]])\n",
    "```\n",
    " \n",
    "但一般用 np.array([[]])代替矩阵进行运算，因为这不但可以表示二维数组，还能表示多维度数组。\n",
    "\n",
    "\n",
    "可以将矩阵视为m个堆放在一起的n维向量，也可以将向量视为一个特殊矩阵。\n",
    "> 张量、阶的概念\n",
    "在某些情况下，将会讨论超过两维的数组。一般的，一个数组中的元素分布在若干维坐标的规则网格中，我们称之为张量\n",
    "\n",
    "在深度学习中，向量化是一个非常重要的概念，例如pytorch，tensorflow的基础数据表达都是向量，但其表达上与Numpy有一定的差别，但概念内涵一致。\n",
    "相关概念包括：\n",
    " \n",
    "\n",
    "* 秩（Rank）：张量轴数。标量的秩为 0，向量的秩为 1，矩阵的秩为 2。\n",
    "* 形状（Shape）：张量的每个轴的长度（元素数量）。\n",
    "* 轴或维度（Axis，Dimension）：张量的一个特殊维度。\n",
    "* 大小（Size）：张量的总项数，即乘积形状向量\n",
    "\n",
    "| 线性代数中概念 | 深度学习中一般表达| Numpy例子|Tensorflow例子|pytorch例子|轴（阶、秩）的数目|\n",
    "| -------- | -------- | -------- | -------- | -------- |-------- |\n",
    "| 标量(Scale)  | “0 秩”张量(\"rank-0\" tensor)   | numpy.array(5)   |tf.constant(5)|troch.tensor(5)|0|\n",
    "| 向量(Vector)  | “1 秩”张量(\"rank-1\" tensor)   | numpy.array([5,1,1])   |tf.constant([5,1,1,1])|troch.tensor([5,1,1,1])|1|\n",
    "| 矩阵(Matrix)  | “2 秩”张量(\"rank-2\" tensor)   | numpy.array([[5,1,1]])   |tf.constant([[5,1,1,1]])|troch.tensor([[5,1,1,1]])|2|\n",
    "\n",
    "> 之前我们学习了向量，实际上$n$维的行向量就可以看作是一个$1 \\times n$的特殊矩阵，同理，$n$维的列向量也可以视为一个$ n \\times 1$的特殊矩阵。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b47e9b56-02e7-4886-b48a-141e42f7e847",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-22T10:22:47.480143Z",
     "iopub.status.busy": "2022-03-22T10:22:47.479554Z",
     "iopub.status.idle": "2022-03-22T10:22:47.487330Z",
     "shell.execute_reply": "2022-03-22T10:22:47.486507Z",
     "shell.execute_reply.started": "2022-03-22T10:22:47.480103Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "矩阵元素个数： 9\n",
      "矩阵的轴数： 2\n",
      "矩阵的形状： (3, 3)\n"
     ]
    }
   ],
   "source": [
    " # 定义一个矩阵\n",
    " import numpy as np \n",
    " m=np.matrix([[1,2,3],[4,5,6],[7,8,9]])\n",
    " print(\"矩阵元素个数：\",m.size)\n",
    " print(\"矩阵的轴数：\",m.ndim)\n",
    " print(\"矩阵的形状：\",m.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78502b29-2588-40f0-ba48-2bf758588903",
   "metadata": {},
   "source": [
    "### 特殊矩阵\n",
    "1. Identity Matrices 单位矩阵\n",
    "\n",
    "An *identity* matrix (usually indicated by a capital **I**) is the equivalent in matrix terms of the number **1**. It always has the same number of rows as columns, and it has the value **1** in the diagonal element positions I<sub>1,1</sub>, I<sub>2,2</sub>, etc; and 0 in all other element positions. Here's an example of a 3x3 identity matrix:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{bmatrix} \\end{equation}\n",
    "\n",
    "Multiplying any matrix by an identity matrix is the same as multiplying a number by 1; the result is the same as the original value:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\\\7 & 8 & 9\\end{bmatrix} \\cdot \\begin{bmatrix}1 & 0 & 0\\\\0 & 1 & 0\\\\0 & 0 & 1\\end{bmatrix} = \\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\\\7 & 8 & 9\\end{bmatrix} \\end{equation}\n",
    "\n",
    "单位矩阵定义为主对角线元素为1，其他元素为0的**方阵**。单位矩阵以符号$I$或$I_n$表示，下标$n$表示其行列数。\n",
    "\n",
    "单位矩阵很重要，因为其与标量代数中的1起到类似的作用。\n",
    "\n",
    "同时单位矩阵不论自乘多少次任保持不变\n",
    "$$(I_n)^k=I_n \\quad (k=1,2,...)$$\n",
    "\n",
    "具有这种性质($AA=A$)的矩阵称为**幂等矩阵** \n",
    " \n",
    "2. 0 矩阵\n",
    "\n",
    "零矩阵是一个所有元素均为0的简单矩阵，但是其不一定是方阵，其起到作用与标量0的作用相似，例如。\n",
    "$$ 0_{(2 \\times 2)}= \\begin{bmatrix} 0&0\\\\0&0 \\end{bmatrix}$$\n",
    "$$ 0_{(2 \\times 3)}= \\begin{bmatrix} 0&0&0\\\\0&0&0 \\end{bmatrix}$$\n",
    "\n",
    "3. 对称矩阵\n",
    "\n",
    "矩阵$C_m \\times n$中若$c_ij=c_ji$，称为对称矩阵，也即元素关于主对角线对称。\n",
    "\n",
    "\n",
    "---\n",
    " \n",
    "Numpy 中相关特殊矩阵的创建：\n",
    " ```python \n",
    " zero=np.zeros((2,3))# 创建2r3c的0矩阵\n",
    " one=np.eye(3)#创建单位矩阵\n",
    " one=np.identity(3)#创建单位矩阵\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9f208247-fd54-4db0-a273-9ea120753054",
   "metadata": {},
   "source": [
    "## Matrix Operations\n",
    "Matrices support common arithmetic operations.\n",
    "\n",
    "### Adding Matrices\n",
    "To add two matrices of the same size together, just add the corresponding elements in each matrix:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\end{bmatrix}+ \\begin{bmatrix}6 & 5 & 4 \\\\3 & 2 & 1\\end{bmatrix} = \\begin{bmatrix}7 & 7 & 7 \\\\7 & 7 & 7\\end{bmatrix}\\end{equation}\n",
    "\n",
    "In this example, we're adding two matrices (let's call them ***A*** and ***B***). Each matrix has two rows of three columns (so we describe them as 2x3 matrices). Adding these will create a new matrix of the same dimensions with the values a<sub>1,1</sub> + b<sub>1,1</sub>, a<sub>1,2</sub> + b<sub>1,2</sub>, a<sub>1,3</sub> + b<sub>1,3</sub>,a<sub>2,1</sub> + b<sub>2,1</sub>, a<sub>2,2</sub> + b<sub>2,2</sub>, and a<sub>2,3</sub> + b<sub>2,3</sub>. In this instance, each pair of corresponding elements(1 and 6, 2, and 5, 3 and 4, etc.) adds up to 7.\n",
    "\n",
    " ---\n",
    " ## Subtracting Matrices\n",
    "Matrix subtraction works similarly to matrix addition:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\end{bmatrix}- \\begin{bmatrix}6 & 5 & 4 \\\\3 & 2 & 1\\end{bmatrix} = \\begin{bmatrix}-5 & -3 & -1 \\\\1 & 3 & 5\\end{bmatrix}\\end{equation}\n",
    "\n",
    "---\n",
    "### Negative Matrices\n",
    "The nagative of a matrix, is just a matrix with the sign of each element reversed:\n",
    "\n",
    "\\begin{equation}C = \\begin{bmatrix}-5 & -3 & -1 \\\\1 & 3 & 5\\end{bmatrix}\\end{equation}\n",
    "\n",
    "\\begin{equation}-C = \\begin{bmatrix}5 & 3 & 1 \\\\-1 & -3 & -5\\end{bmatrix}\\end{equation}\n",
    "\n",
    "---\n",
    "#### Conformability（矩阵一致性）\n",
    "In the previous examples, we were able to add and subtract the matrices, because the *operands* (the matrices we are operating on) are ***conformable*** for the specific operation (in this case, addition or subtraction). To be conformable for addition and subtraction, the operands must have the same number of rows and columns. There are different conformability requirements for other operations, such as multiplication; which we'll explore later."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e39a9786-81ea-40d2-9fe5-506322d8197c",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "e3ee88da-7c19-4836-818b-6553f6251a4e",
   "metadata": {},
   "source": [
    "### Matrix Transposition（矩阵转置）\n",
    "You can *transpose* a matrix, that is switch the orientation of its rows and columns. You indicate this with a superscript **T**, like this:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}1 & 2 & 3 \\\\4 & 5 & 6\\end{bmatrix}^{T} = \\begin{bmatrix}1 & 4\\\\2 & 5\\\\3 & 6 \\end{bmatrix}\\end{equation}\n",
    "\n",
    "矩阵的转置有如下性质：\n",
    "* 和的转置为转置的和\n",
    "$$ (A+B)^T= A^T+B^T $$\n",
    "* 乘积的转置是转置的乘积，但转置的顺序颠倒\n",
    "$$ (AB)^T=B^TA^T$$\n",
    "\n",
    "---\n",
    "\n",
    "In Python, both *numpy.**array*** and *numpy.**matrix*** have a **T** function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b7ac8dbc-dc4c-4073-a58a-9796e48756b6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-23T03:53:35.872502Z",
     "iopub.status.busy": "2022-03-23T03:53:35.871731Z",
     "iopub.status.idle": "2022-03-23T03:53:35.878182Z",
     "shell.execute_reply": "2022-03-23T03:53:35.877523Z",
     "shell.execute_reply.started": "2022-03-23T03:53:35.872471Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始矩阵： \n",
      " [[ 0  1  2  3  4]\n",
      " [ 5  6  7  8  9]\n",
      " [10 11 12 13 14]]\n",
      "转置后矩阵: \n",
      " [[ 0  5 10]\n",
      " [ 1  6 11]\n",
      " [ 2  7 12]\n",
      " [ 3  8 13]\n",
      " [ 4  9 14]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "m1=np.arange(0,15,1).reshape(3,5)\n",
    "m2=m1.T\n",
    "print(\"原始矩阵： \\n\",m1)\n",
    "print(\"转置后矩阵: \\n\",m2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eddaa41b-7b75-46c8-a875-c161e6cd8ea9",
   "metadata": {},
   "source": [
    "### 矩阵乘法\n",
    "矩阵乘法是矩阵运算中最重要的操作之一，两个矩阵$A(m \\times n),B(n \\times p)$的矩阵乘积（matrix product）是第三个矩阵$C $。为了使得乘法可以被定义，矩阵$A$ 的烈数$n$必须和矩阵$B$的行数$n$相等，得到的矩阵$C$的形状是$ m \\times p$。\n",
    "$$ C=AB $$\n",
    "对应具体$C$ 中元素 $C_{i,j}$\n",
    "$$ C_{i,j}= \\sum_k A_{i,k} B_{k,j} $$\n",
    "\n",
    ">需要注意，两个矩阵的标准乘积不是两个矩阵中对应元素的乘积，但这样的操作存在，即元素对应乘积(element-wise product)或者Hadamard乘积，记为\n",
    "$ A \\odot B$\n",
    "\n",
    "结合向量内积概念，以及矩阵是多个向量的组合，可以将矩阵乘积$C=AB$的元素$c_{i,j}$简单地描述为前一个矩阵$A$的第$i$行与后一个矩阵B中的第$j$列的**内积** 。反之，可以将两个相同维数的向量$x,y$的内积，视为第一个向量与第二个向量转置后的矩阵乘积 $xy^T$。\n",
    "\n",
    "相关定律：\n",
    "* 矩阵乘法不满足交换律（标量除外）： $AB \\neq\\; BA $\n",
    "* 矩阵乘法满足结合律： $ (AB)C=A(BC)=ABC $\n",
    "* 矩阵乘法满足分配率： $A(B+C)=AB+AC; (B+C)A=BA+VA $\n",
    "\n",
    "\n",
    "---\n",
    "Numpy中，矩阵的乘法依据创建矩阵的方式不同：\n",
    "\n",
    "1. 若使用np.array([[]])方式创建矩阵A,B则：\n",
    "\n",
    "``` python\n",
    "C=np.dot(A,B)#矩阵乘积\n",
    "m=A*B#A,B 矩阵的shape相同，得到对应元素乘积（Hadamard乘积）\n",
    "```\n",
    "2. 使用matrix创建的矩阵\n",
    "```python\n",
    "A=np.mat()\n",
    "B=np.mat()\n",
    "C=A*B#矩阵乘积直接使用 * \n",
    "m=np.multiply(A,B)# 同型矩阵对应元素乘积使用np.multiply()\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "822e4600-00d2-46a0-8882-0998d729cfc9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-23T03:59:59.495455Z",
     "iopub.status.busy": "2022-03-23T03:59:59.495004Z",
     "iopub.status.idle": "2022-03-23T03:59:59.508328Z",
     "shell.execute_reply": "2022-03-23T03:59:59.507705Z",
     "shell.execute_reply.started": "2022-03-23T03:59:59.495419Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "矩阵A： \n",
      " [[ 0  1  2  3  4]\n",
      " [ 5  6  7  8  9]\n",
      " [10 11 12 13 14]] \n",
      " 矩阵B： [[16 17 18]\n",
      " [19 20 21]\n",
      " [22 23 24]\n",
      " [25 26 27]\n",
      " [28 29 30]]\n",
      "矩阵1形状： (3, 5) 矩阵2形状： (5, 3)\n",
      "矩阵乘积： \n",
      " [[ 250  260  270]\n",
      " [ 800  835  870]\n",
      " [1350 1410 1470]]\n",
      "矩阵乘积形状: (3, 3)\n",
      "C中对应元素ij为A的i行向量与B的j列向量内积: 250\n",
      "如果是求对应元素的乘积，那么A，B矩阵的形状必须相同 \n",
      "\n",
      "A2，B矩阵对应元素乘积： [[  0  17  36]\n",
      " [ 57  80 105]\n",
      " [132 161 192]\n",
      " [225 260 297]\n",
      " [336 377 420]]\n",
      "两个向量的dot得到一个标量： 70\n",
      "两个向量对应矩阵的乘积，转换为第一个矩阵与第二个矩阵转置的dot，得到一个矩阵： [[70]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "A=np.arange(0,15,1).reshape(3,5)\n",
    "B=np.arange(16,31,1).reshape(5,3)\n",
    "print('矩阵A：','\\n',A,'\\n','矩阵B：',B)\n",
    "print(\"矩阵1形状：\",A.shape,\"矩阵2形状：\",B.shape)\n",
    "C=np.dot(A,B)\n",
    "print(\"矩阵乘积：\",'\\n',C)\n",
    "print(\"矩阵乘积形状:\",C.shape)\n",
    "A_r1=A[0,:]\n",
    "B_c1=B[:,0]\n",
    "C_11=np.dot(A_r1,B_c1)\n",
    "print(\"C中对应元素ij为A的i行向量与B的j列向量内积:\",C_11)\n",
    "\n",
    "A2=A.reshape(5,3)\n",
    "print(\"如果是求对应元素的乘积，那么A，B矩阵的形状必须相同 \\n\")\n",
    "C2=A2*B\n",
    "print(\"A2，B矩阵对应元素乘积：\",C2)\n",
    "\n",
    "v1=np.array([1,2,3,4,5])\n",
    "v2=np.array([2,3,4,5,6])\n",
    "v3=np.dot(v1,v2)\n",
    "print(\"两个向量的dot得到一个标量：\",v3)\n",
    "m1=np.array([[1,2,3,4,5]])\n",
    "m2=np.array([[2,3,4,5,6]])\n",
    "m3=np.dot(m1,m2.T)\n",
    "print(\"两个向量对应矩阵的乘积，转换为第一个矩阵与第二个矩阵转置的dot，得到一个矩阵：\",m3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1c838fd4-72ac-42eb-b5c0-80a7b49da4a1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-23T10:11:22.365460Z",
     "iopub.status.busy": "2022-03-23T10:11:22.364359Z",
     "iopub.status.idle": "2022-03-23T10:11:22.373511Z",
     "shell.execute_reply": "2022-03-23T10:11:22.372512Z",
     "shell.execute_reply.started": "2022-03-23T10:11:22.365417Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 7 10]\n",
      " [15 22]\n",
      " [23 34]]\n",
      "[[ 1  4]\n",
      " [ 9 16]\n",
      " [35 54]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "d1=np.mat([[1,2],[3,4],[5,6]])\n",
    "d2=np.mat([[1,2],[3,4]])\n",
    "print(d1*d2)\n",
    "d3=np.array([[1,2],[3,4],[5,6]])\n",
    "d4=np.array([[1,2],[3,4],[7,9]])\n",
    "print(np.multiply(d3,d4))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31a2edbe-2372-4358-9b96-7f054b32e87a",
   "metadata": {},
   "source": [
    "### 矩阵与向量相乘\n",
    "矩阵和向量相乘是线性方程、机器学习中最重要的操作之一。\n",
    "\n",
    "设矩阵$A_{m \\times n}$与$n$维数向量$x$相乘，得到$m \\times 1$维度的向量，即 $m \\times 1$阶矩阵$b$。\n",
    "\n",
    "$$ A \\times x=b $$\n",
    "矩阵与相连相乘，可以理解为向量$x$和向量$b$的一种映射关系，矩阵$A$是描述这种关系的参数，可看作线性变换。\n",
    "\n",
    "从空间上看，向量$x$在指定矩阵$A$的作用下，原始空间的向量$x$被转换到了目标空间的新坐标，向量空间的位置由此发生了改变，甚至在映射之后，目标空间的维数相较于原始空间都可能发送改变。\n",
    "例如：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "dcfea309-7803-412e-b285-bb96f9343d19",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-24T01:38:11.446588Z",
     "iopub.status.busy": "2022-03-24T01:38:11.445952Z",
     "iopub.status.idle": "2022-03-24T01:38:11.609315Z",
     "shell.execute_reply": "2022-03-24T01:38:11.608567Z",
     "shell.execute_reply.started": "2022-03-24T01:38:11.446556Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2,)\n",
      "原有向量空间表达：\n",
      "矩阵A的形状： (3, 2)\n",
      "[13 19 15]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAElCAYAAABect+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJztnW+MW+WZ9i/PeMbj8diesT38aSCFNqRMw4ZpEgTSsruBElhEQApqq2pTYLctElKpFmhhN5+20gqlnW42jQofKlWIbFgVqf0CG0JeFNCK3axolBUhyabQVsssM5EIHo89tmc8jsdz3g/OOXEgf+zJOX6u5577JyFPgufMffk6c8Xn8f3cJ+Q4DhRFUWygy3QBiqIoraKBpSiKNWhgKYpiDRpYiqJYgwaWoijWoIGlKIo1aGApimINGliKoliDBpaiKNaggaUEQigU2m+6BkUe4Tafr/t4lJZYv349oOeL0jqhVp5E/Q6rXC6bLiEwJGsDgMXFRdMlBIp0/1j1UQdWpVIxXUJgSNYGyA8s6f6x6qMOLEVRlGaoAysej5suITAkawOA7u5u0yUEinT/WPVRB1Yo1NI6nJVI1rYckO4fqz7qwCoWi6ZLCAzJ2gCgXq+bLiFQpPvHqo86sBRFUZqhDqy+vj7TJQSGZG0A0NVFfWpdNtL9Y9VHfVbFYjHTJQSGZG2A/MCS7h+rPuqzKpfLmS4hMCRrA4CFhQXTJQSKdP9Y9VEHlqIoSjPUgSW5l0eytuWAdP9Y9VEHViqVMl1CYEjWBgDhcLv76u1Cun+s+qgDa3p62nQJgSFZGyB/DUu6f6z6qANLcvOhZG3LAen+seqjDixFUZRmqAMrnU6bLiEwJGsD5K9hSfePVR91YM3OzpouITAkawPkz8OS7h+rPurAmp+fN11CYEjWBsgPLOn+seqjDixFUZRmqAMrkUiYLiEwJGsDeBsP/UK6f6z6qAPLceTedEWytuWAdP9Y9VEHVqlUMl1CYNiorV6v4ytf+Qo2b97c0nMlY6N/7cCqjzqwFC527dqFkZER02UoyxjqwIpGo6ZLCAzbtE1OTuK1117Dd7/73ZaeL30elm3+tQurPuqzivVF8wPbtD3xxBMYGxtrOYg0sOyGVV9b7chzc3NeQ1ksFkM4HMbMzAwAoLe3F4lEAlNTUwAad93IZDIoFAqo1WoAgKGhIVSrVczNzQEABgYG0N3d7R0jEokgHo97xygUCrjhhhuQz+e9zbSpVAqVSsW70WM8HkcoFPKG5vf19SEWi3kDyLq7u5FKpTA9Pe2tq6TTaczOznq9JolEAo7jeNft0WgU0WjU2wAaDocxNDSEXC7n9RdlMhmUSiVUq1UAQDKZRL1e9+6Y29/fj0gkgnw+DwDo6enB4OAgpqam4DgOpqensXr1ahSLRZw+fdo7xsLCwjmvcU9PDwqFgvcaJ5NJ7xjuazwzM+MdY3BwELVazVef3n77baTTaaxcuRIHDx7EwsICHMfxjtHV1YV0Oo2dO3di9+7dAICpqSmUy2XrfXKP8WmfTp065Y0RZvHpUr9Prk+t/D6Nj48jlUp1zKfh4WG0QqjNTwM6+tFBNpttWYht2KRt27Zt2LNnD8LhMObn51EsFvHggw/ipZdeuuD3jI6O4siRIx2ssrPY5N9SMKCvpfuKUb9vl7wfzSZt27dvx+TkJMbHx/Hyyy/jzjvvvGhYAbz3tfMLm/xbCqz6qANraGjIdAmBIVkbIL9xVLp/rPqoA4t1EL4f2Kpt48aN2Lt37yWfJ32An63+tQqrPurAkryBVrK25YB0/1j1UQeWoihKM9SBlclkTJcQGJK1AbyLtn4h3T9WfdSBxbqfyQ8kawN0L6HtsOqjDiy32U8ikrUBvLv9/UK6f6z6qANLURSlGerASiaTpksIDMnaAPl9WNL9Y9VHHViS10EkawPkXxJK949VH3VguRtUJSJZG8Dbx+MX0v1j1UcdWIqiKM1QB1Z/f7/pEgJDsjZA/jws6f6x6qM+qyKRiOkSAkOyNkD+tAbp/rHqow4sd6iaRCRrA3gXbf1Cun+s+qgDS1EUpRnqwOrp6TFdQmBI1gbIvyRs9q9eB44fN1hMALCen9SBNTg4aLqEwJCsDZDfOOr697vfAevWAWvXAqTb75YE6/lJHVju8HyJSNYGyB/g9/HHU/iHfwDWrweOHgUyGSAeN12Vf7Cen9QzQCR3S0vWJp3//m/g0UcdfPABcOZmM1i/3mxNfsN6flK/w1IUJioV4IkngD/7M2BiAjhzdy309AB/8Rdma1suUL/DYh0i5geStQHyBvidOtVYq8rnG8FVqZz1LxoFbrnFYHEBwHp+Ur/Dcm+6KRHJ2gB5fVhdXY1gcj/8TCTO+lepNMJMEqznJ3VguXfJlYhkbQDvGshSGR5ufCL49NONP/f2nvUvlQJI74q1ZFjPT+rAUhQmenqAu+9ufN3dDcRija+lvbtihjqwWIeI+YFkbYDMPqx6HfjTPwX6+oAPP0ziH//x3BCTBOv5SR1Yknt5JGsD5F0SAo3mUKCx8O44C3jySWBqCvjbvzVbVxCwnp/UgTU7O2u6hMCQrA2QN8Bv3z7gxAnglVca77Bc/xKJswvxkmA9P6kDS1EYOH0auO8+4ItfBB54wHQ1yxvqwIq5q5oCkawNkDXA74orGo8ffHD276T7x6qP+qxi3THuB5K1AXKmNezZA8zMAG+/3fhk0EW6f6z6qAOrUCiYLiEwJGsDZDSOlkrAww8Df/7nje04zUj3j1UfdWApikkSicbjv/+70TKUJqgDq7e313QJgSFZG2D/JeHOnY3H9947/6eA0v1j1UcdWKzNa34gWRtgd+NoNgs89RTwV391tvfq00j3j1UfdWCxDhHzA8naAN7Gw1ZwPxX813+98HOk+8eqjzqwJHZLu0jWZjN///eNx//934s/T7p/rPqoA8v2dZCLIVmbrfzf/wE/+UnjcvD66y/+XOn+seoLtZmknLGr0LFhwwYcPnzYdBlt4f6Okr65kE5LCUn9DmtmZsZ0CYEhWRtgXx/WX/914/Hjj1t7vnT/WPVRBxbrEDE/kKwN4F0DOR//8z/A7t3A2Bhw5ZWtfY90/1j1UQeWogSN4wA33dT42p0mqvBCHVisN3P0A8naAHv6sNzhe+1eAUn3j1UfdWDVajXTJQSGZG2AHZeE//VfwIEDwAsvnN2G0yrS/WPVRx1YrEPE/ECyNoB/gJ877jgaBf7mb9r/fun+seqjDixFCYrmcceKPVAHFusQMT+QrA3gHuDnjjt+9VUgElnaMaT7x6qP96yCvLsHN2ObtomJCdxxxx348pe/jDVr1mDXrl0XfT5rp3S12hh3vGoVcP/9Sz+Obf61C6s+6sBibV7zA9u0hcNh7NixAydOnMA777yD559/HidOnLjg81kbR92Nze+/f3nHsc2/dmHVRx1YCg9XX3011p25Y2g8HsfIyAhOnjxpuKr22LMHKBaB//iPc8cdK/ZAHVisQ8T8wGZt4+PjePfdd3Hrrbde8Dlsl4TuuOONG4Hbb7/849nsXyuw6mvrQnVubs77uDMWiyEcDntvHXt7e5FIJLw5OqFQCJlMBoVCwevpGBoaQrVaxdzcHABgYGAA3d3d3jEikQji8fg5xwCAfD7vzVdKpVKoVCqoVCoAGv/ah0IhFItFAEBfXx9isRhyuRyARgNjKpXC9PS0d5mSTqcxOzuL+fl5AEAikYDjOCiVSgCAaDSKaDSK6enpxosUDmNoaAi5XM77uD6TyaBUKqFarQJoDDyr1+sol8sAgP7+fkQiEeTPfAzV09ODwcFBTE1NwXEc779isehtg0gmk1hYWDjnNe7p6fHma/f29iKZTHrHcF/jmZkZ7xiDg4Oo1WqB+VQul7Flyxbs3LkT1WoV2WwWXV1dSKfT2LlzJ3bv3u15Vi6XaXz64heryGSA/fuTqFRa98k9xqd9CofDyGaztD4Bn/19cn1q5ffJ9bZTPg0PD6MVqKc1ZLPZloXYho3aarUaNm/ejHvuuQdPPfXURZ87OjqKI0eOdKiyi/PP/wz84AeNcccXmiDaLjb61w4G9Nk/rUHhwXEcfOc738HIyMglw4qJbLYRVhcbd6zYA3Vgsa2D+Ilt2g4ePIg9e/bgrbfewujoKEZHR7Fv3z7TZV2SVsYdLwXb/GsXVn2czRZnyGQypksIDNu03X777W3tD2To42l13PFSsM2/dmHVR/0Oi/Vmjn4gWRtgvg/LHXf8wx9eetzxUpDuH6s+6sBi3THuB5K1AeanNVx3XePxpz8N5vjS/WPVRx1YirIUHn648XjqlNk6FP+hDqyhoSHTJQSGZG2AuQF+x483OtrHxs4uuAeBdP9Y9VEHltuUKRHJ2gAzl4SOA/zJnzS+DnrcsXT/WPVRB5bbwSsRydoAMwP8ljrueClI949VH3VgKUqruOOOX3yx/XHHij1QB9bAwIDpEgJDsjagswP83HHH/f3AI4905mdK949VH3Vg2XLnlaUgWRvQ2U5p9zZdZ/bWdgTp/rHqow4s1iFifiBZG9C5xtHXXmsM47ucccdLQbp/rPqoA0tRLka1CmzeDNxww+WNO1bsgTqwIp38J7PDSNYGdOaS0O2z+t3vAv9Rn0G6f6z6qAMrHo+bLiEwJGsDgl8DMT3uWLp/rPqoA8udlCgRydoAeBMtg8DvccdLQbp/rPqoA0tRzofbZ/XWW2brUDoPdWAx34zzcpGsLUh27Gg8Hj0KmJwxJ90/Vn3UM90Ve9mwYQMOHz7s6zGz2cZC+9atwEsv+XpoxTz2z3R372QiEcnagGD6sNxPBRnCSrp/rPqoAyvIhVvTSNYG+D+t4e/+rvH44Ye+HnbJSPePVR91YCkKAIyPN+Zb/fCHZyeJKssT6jWser1Ou6fpcpGsDfB3DctdXDc8dfkcpPtnQJ/9a1ju3WglIlkb4N88LNZxx9L9Y9WngWUIydoAfwLLHXf8T/8U7LjjpSDdP1Z91IGlLF+axx3/4Adma1F4oA4s1v1MfiBZG3D5ewnvuqvxSDrlRLx/rPqoA4v1dtl+IFnb5XLwYGPbDfO4Y+n+seqjDqxisWi6hMCQrA1YeuNovd7Y0ByLdW7c8VKQ7h+rPurAUpYf7rjjXM5sHQon1IHV19dnuoTAkKwNWNrmWXfc8b/9W2fHHS8F6f6x6qMOrFgsZrqEwJCsDWg/sNxxx6tXNx7Zke4fqz7qwMoJvi6QrA1ofy9aJtN4PHEigGICQLp/rPqoA0tZHvzLvwDlMvCf/2lm3LFiD9SBJXmvlmRt7VAqNT4NvPPOxs1QbUG6f6z6qDc/K/bS6uZnt91ncdHsBFHFOPZvfp7u5K18O4xkbUBra1juuONjx+wLK+n+seqjDqxO3T3YBJK1tcInnzTmW23derb3yiak+8eqjzqwFLlceWXjkWHcsWIP1IGVTqdNlxAYkrUBQDgcvuD/e+aZxiPLuOOlIN0/Vn3UgTU7O2u6hMCQrA248Dys8XHgpz9thJbN446l+8eqjzqw5ufnTZcQGJK1ARcOrOuvbzz+5CcdLCYApPvHqo86sBRZPPRQ45Ft3LFiD9SBlWAdhuQDkrUBn208PHasscDOOO54KUj3j1UfdWD5fW87JiRr+zSOA6xd2/hayrhj6f6x6qMOrFKpZLqEwJCsDTi3j8cdd0w6E25JSPePVR91YCn244473r0bIB0TrlgEdWBFo1HTJQSGZG1AYx6WO+54YODs/QWlIN0/Vn0aWIawUdv+/fvxpS99CatWrcKPf/zjiz63q6sLa9Y0vp6a6kBxHcZG/9qBVR91YLFuwPQD27TV63V873vfw+uvv44TJ07gV7/6FU5cZNpePr+ADz6wY9zxUrDNv3Zh1UcdWAoPhw4dwqpVq/CFL3wBvb29+OY3v4lXXnnlvM+tVoGPPgJuvNGOcceKPbQ1D2vTpk1ONpsF0HjLHwqFvE+DQqEQuru7zxkrEg6HUa/XvY9Iu7u74TiO1wV9qWPkcjlceeWV5xwjHA5jcXHRO4bb7+Meo6urC11dXZ+p49N/bucYndLW7jH8qKPVYxQKBczMzODaa69FKBRCoVBAqVTCNddc4x3j1KlTyOVycBxgfv40RkfXwnHs9ulCx/jkk0+8/XZMPrV7jAu9xq6+Tvn03nvv/T/Hcf4Sl4B6gF+rQ+BsxDZtv/nNb7B//3788pe/BADs2bMHv/3tb/Hcc8+d9/mxWIx2P5of2OZfuxjQZ/8Av3ZvZGATtmlbsWIFJiYmvD9PTk5ixYoVF3w+a+OhX9jmX7uw6qMOLIWHW265BX/4wx/w4Ycf4vTp03j55ZfxwAMPmC5LWWZceGgRAQ+5u2UFYpu2cDiM5557Dvfccw/q9Tq+/e1vY43bt3AeWOcp+YVt/rULqz7qNSzHcRCybdh3i0jWBshf45HunwF99q9hse5n8gPJ2gDemeB+Id0/Vn3UgVWtVk2XEBiStQHyF92l+8eqjzqwXHbs2IFQKIQpYXs8nn76adx4441Yu3YttmzZgkKhYLokX9i/fz/ef//9lrbw2MbExATuuOMO3H777VizZg127dpluiTfqdfruPPOO7GZsOuXOrCSySQmJibwxhtvYOXKlabL8ZVkMolNmzbh+PHjOHr0KFavXo3t27ebLuuycbfwrFq1qqUtPLYRDoexY8cOHDt2DO+88w6ef/55UfoAYNeuXRf9QMUk1IFVr9fx5JNPYmxsTNwCZ71ex9133+3dXea2227D5OSk4aouH3cLT29v7yW38NjI1VdfjXXr1qFeryMej2NkZAQnT540XZZvTE5O4rXXXsMjjzxiupTzQh1Yv/71r7FixQrcfPPNpkvxnXK5fM6fX3jhBdx7772GqvGPkydP4tprr/W2aVxzzTWifqFdyuUyxsfH8e677+LWW281XY5vPPHEExgbG6NdwzLeh3XXXXfh448//szfP/vss9i1axfeeustA1X5x4X0PfPMM3j4zJCoZ599FuFwGFu3bu10ecoSKZfL+NrXvoaf/exntPPP22Xv3r244oorsH79+nN2NTBhPLAOHDhw3r8/duwYPvroI+/d1eTkJNatW4dDhw7hqquu6mSJl8WF9Ln77F588UXs3bsXb775pojLXncLT1dX4837pbbw2EitVsOjjz6KrVu34sEHHzRdjm8cPHgQr776Kvbt24dKpYJSqYRvfetbeInp9tyO47TzX0ep1Wre15///OedbDbb6RICo1arOa+//rozMjLifPLJJ6bL8Y1areZcf/31zk033eRUq1Vn7dq1zvHjx02X5RuLi4vOQw895Hz/+983XUqgHDhwwLnvvvs6+SNbyiDqNax8Pm+6hMDI5/N4/PHHUSqVsGnTJoyOjuKxxx4zXdZl427h+f3vf4+RkRF84xvfoP3EaSkcPHgQe/bswYEDBzA6OorR0VHs27fPdFm+w9o4Sr01J5vNYnh4uJM/smNI1gYAo6OjOHLkiOkyAkO6fwb02b81p6enx3QJgSFZGwAR63EXQ7p/rPqoA2twcNB0CYEhWRvw2Ts/S0O6f6z6qANL2lacZiRrA3gHwPmFdP9Y9VEHVpvra1YhWdtyQLp/rPqoA0tRFKUZ6sDKZDKmSwgMydoAeHskpSLdP1Z91IFVLBZNlxAYkrUB8gf4SfePVR91YJ0+fdp0CYEhWRvAuwbiF9L9Y9VHHViKoijNUAdWMpk0XUJgSNYGyO/Dku4fqz7qwJLcyyNZGyD/klC6f6z6qANL8q3OJWsD4A3wk4p0/1j1UQeWoihKM9SBFYvFTJcQGJK1AfAG+ElFun+s+qjPKtYd434gWRug0xpsh1UfdWBJuU/f+ZCsDZDfOCrdP1Z91IGlKIrSDHVg9fb2mi4hMCRrA+RfEkr3j1UfdWCxNq/5gWRtgDaO2g6rPurAYh0i5geStQG8jYd+Id0/Vn3UgSW5W1qytuWAdP9Y9VEHluR1EMnalgPS/WPVRx1YrEPE/ECyNkAH+NkOqz7qwJqZmTFdQmBI1gbI78OS7h+rPurAYh0i5geStQG8ayB+Id0/Vn3UgaUoitIMdWCx3szRDyRrA+T3YUn3j1UfdWDVajXTJQSGZG2A/EtC6f6x6qMOLNYhYn4gWRugA/xsh1UfdWApiqI0Qx1YrEPE/ECyNkAH+NkOqz7qs0py86FkbQBvp7RfSPePVR91YLE2r/mBZG2ANo7aDqs+6sBSFEVphjqwWIeI+YFN2p5++mnceOONWLt2LbZs2dLS+Fzpl4Q2+bcUWPVRB1YikTBdQmDYpG3Tpk04fvw4jh49itWrV2P79u2X/B7pjaM2+bcUWPVRBxbrEDE/sEnb3Xff7S3C3nbbbZicnLzk9+gAP7th1UcdWAofL7zwAu69917TZSjLlLY+u5ybm/M6YGOxGMLhsPdpQm9vLxKJhJfMoVAImUwGhULBa/MfGhpCtVrF3NwcAGBgYADd3d3eMSKRCOLxuHeMmZkZDA8PI5/Pe/9ip1IpVCoVVCoVAEA8HkcoFEKxWAQA9PX1IRaLIZfLAWhcmqRSKUxPT3ufXKXTaczOzmJ+fh5A4+2v4zgolUoAgGg0img0iunp6caLFA5jaGgIuVzO6+DOZDIolUqoVqsAGjOw6/U6yuUyAKC/vx+RSAT5fB5A4z5vg4ODmJqaguM4yOfzyGQyKBaL3s74ZDKJhYWFc17jnp4eb82ot7cXyWTSO4b7Gs/MzHjHGBwcRK1Wa9unjRs34tSpU95rtri4CMdxsG3bNnz9619Hd3c3fvSjH6Fer+P++++H4zjeMbq6upBOp7Fz507s3r0bAJDL5VAul633yT3Gp32qVqvIZrMd9+lyfp9cn1r5fXJfj075NDw8jFYItbnnS/YGMeWCvPjii/jFL36BN998E/39/Zd8/oYNG3D48OEOVKYIoaVPaagvCVlv5ugHNmnbv38/xsbG8Oqrr7YUVoD8Piyb/FsKrPqoA4t1x7gf2KTt8ccfR6lUwqZNmzA6OorHHnvskt+j0xrshlUfZ/+9QsUf//hH0yUoCgDyd1hDQ0OmSwgMydoA+X1Y0v1j1UcdWO4nOxKRrA2Qf0ko3T9WfdSB5X5cKxHJ2gD5A/yk+8eqjzqwFEVRmqEOrIGBAdMlBIZkbYD8AX7S/WPVR31WSV64lawNkD+tQbp/rPqoA4t1iJgfSNYGyG8cle4fqz7qwFIURWmGOrAikYjpEgJDsjZA/iWhdP9Y9VEHVjweN11CYEjWBvCugfiFdP9Y9VEHFusQMT+QrA3QAX62w6qPOrAURVGaoQ4syb08krUtB6T7x6qPs6ozpNNp0yUEhmRtAO+NOP1Cun+s+qgDyx3TKhHJ2gD5fVjS/WPVRx1YkhduJWsD5E9rkO4fqz7qwFIURWmGOrBSqZTpEgJDsjZA/hqWdP9Y9VEHlnvrIYlI1gbIn4cl3T9WfRpYhpCsDdDAsh1WfdSBpSiK0gx1YLHuZ/IDydoA3UtoO6z6qANL8o5/ydqWA9L9Y9VHHVjFYtF0CYEhWRsgv3FUun+s+qgDS1EUpRnqwOrr6zNdQmBI1gbwbp71C+n+seqjPqtisZjpEgJDsjZAfmBJ949VH/VZlcvlTJcQGJK1Abx70fxCun+s+qgDS1EUpRnqwJLcyyNZ23JAun+s+qgDi3UDph9I1gbo5mfbYdVHHVjT09OmSwgMydoA+WtY0v1j1UcdWJKbDyVrWw5I949VH3VgKYqiNEMdWKyD8P1AsjZA/hqWdP9Y9VEH1uzsrOkSAkOyNkD+PCzp/rHqow6s+fl50yUEhmRtgPzAku4fqz7qwFIURWmGOrASiYTpEgJDsjaAt/HQL6T7x6qPOrAk39tOsrblgHT/WPVRB1apVDJdQmBI1gbw9vH4hXT/WPVRB5aiKEoz1IEVjUZNlxAYkrUB8udhSfePVR/1WcX6ovmBZG2ABpbtsOqjPqtYN2D6gWRtgG5+th1WfdSBpXCxY8cOhEIhTE1NmS5FWaZQB5bk/Wi2aZuYmMAbb7yBlStXtvR81vva+YVt/rULqz7qwBoaGjJdQmDYpu3JJ5/E2NhYy0EkvXHUNv/ahVUfdWCxDsL3A5u0vfLKK1ixYgVuvvnmlr9H+hqWTf4tBVZ9bb3vm5ub83Zxx2IxhMNhzMzMAAB6e3uRSCS89Y1QKIRMJoNCoYBarQagkdrVahVzc3MAgIGBAXR3d3vHiEQiiMfj3jEKhQLS6TTy+bz3C5BKpVCpVFCpVAAA8XgcoVDIu1NtX18fYrGY94J3d3cjlUphenraa2ZMp9OYnZ31NngmEgk4juM1y0WjUUSjUW/hMRwOY2hoCLlcztvUm8lkUCqVUK1WAQDJZBL1eh3lchkA0N/fj0gkgnw+DwDo6enB4OAgpqam4DgOpqenkUqlUCwWcfr0ae8YCwsL57zGPT09KBQK3mucTCa9Y7iv8czMjHeMwcFB1Gq1tn3auHEjTp065b1mi4uLcBwH27Ztw89//nPs27cP2WwWi4uLKJVKSKfT3jG6urqQTqexc+dO7N69GwAwNTWFcrlsvU/uMT7t09zcnPczOunT5fw+uT618vs0NTWFxcXFjvk0PDyMVgi12YLf0X79bDbbshDbsEXbsWPH8NWvfhX9/f0AgMnJSXzuc5/DoUOHcNVVV13w+0ZHR3HkyJFOldlxbPFvqRjQ19JaA3Vguf86ScRWbddddx0OHz6MTCZz0edt2LABhw8f7lBVncdW/1rFgL6Wfhj1GhbrfiY/kKwN0L2EtsOqj/OzyzO46w4SsVXb+Ph4S89j3e3vF7b61yqs+qjfYSmKojRDHVjJZNJ0CYEhWRsgvw9Lun+s+qgDS/I6iGRtgPxLQun+seqjDiy3V0YikrUB8m9CId0/Vn3UgaUoitIMdWC5zYoSkawNkD8PS7p/rPqoz6pIJGK6hMCQrA2QP61Bun+s+qgDy93fJRHJ2gDeRVu/kO4fqz7qwFIURWmGOrB6enpMlxAYkrUB8i8JpfvHqo86sAYHB02XEBiStQHyG0el+8eqjzqwJM8Ol6wNkD/AT7p/rPqoA0tyt7RkbcsB6f6x6qMOLEVRlGaoA+tSQ+JsRrI2gPfkx9xTAAAAwElEQVSuK34h3T9WfdSB5c7/lohkbYD8Pizp/rHqow4sd2C/RCRrA3jXQPxCun+s+qgDS1EUpRnqwGIdIuYHkrUB8vuwpPvHqo86sCT38kjWBsi/JJTuH6s+6sBybzIpEcnaAPkD/KT7x6qPOrAURVGaafdGqorSEqFQaL/jOH9pug5FFhpYiqJYg14SKopiDRpYiqJYgwaWoijWoIGlKIo1aGApimINGliKoliDBpaiKNaggaUoijVoYCmKYg3/HydfS3ByiPpqAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np \n",
    "import matplotlib.pyplot as plt\n",
    "#原始x为二维空间向量\n",
    "x=np.array([2,3]).T\n",
    "print(x.shape)\n",
    "### 通过设置spines，将上面的sin图进行修饰\n",
    "fig3,axes3=plt.subplots()\n",
    "fig3.set_size_inches(5,5)\n",
    "axes3.set_xlim(-5,5)\n",
    "axes3.set_ylim(-5,5)\n",
    " \n",
    "axes3.spines['top'].set_visible(False)\n",
    "axes3.spines['right'].set_visible(False)\n",
    "axes3.spines['left'].set_position(('data',0))\n",
    "axes3.spines['bottom'].set_position(('data',0))\n",
    "# 为图像添加网格\n",
    "axes3.grid(color='gray',linestyle='--',alpha=0.2)\n",
    " \n",
    "\n",
    "axes3.arrow(0,0,x[0],x[1],width=0,shape='full',head_width=0.25,head_length=0.3,color='blue')\n",
    "print(\"原有向量空间表达：\")\n",
    "\n",
    "A=np.array([[2,3],[2,5],[6,1]])\n",
    "print(\"矩阵A的形状：\",A.shape)\n",
    "b=np.dot(A,x)\n",
    "print(\"经过与矩阵A乘积后的新向量：\",b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60b219c2-2ff3-460e-b17c-2e9319ae41a0",
   "metadata": {},
   "source": [
    "## Matrix Division 矩阵除法（矩阵的逆）\n",
    "You can't actually divide by a matrix; but when you want to divide matrices, you can take advantage of the fact that division by a given number is the same as multiplication by the reciprocal of that number. For example:\n",
    "\n",
    "\\begin{equation}6 \\div 3 = \\frac{1}{3}\\times 6 \\end{equation}\n",
    "\n",
    "In this case, <sup>1</sup>/<sub>3</sub> is the reciprocal of 3 (which as a fraction is <sup>3</sup>/<sub>1</sub> - we \"flip\" the numerator and denominator to get the reciprocal). You can also write <sup>1</sup>/<sub>3</sub> as 3<sup>-1</sup>.\n",
    "\n",
    "### Inverse of a Matrix\n",
    "For matrix division, we use a related idea; we multiply by the *inverse* of a matrix:\n",
    "\n",
    "\\begin{equation}A \\div B = A \\cdot B^{-1}\\end{equation}\n",
    "\n",
    "The inverse of B is B<sup>-1</sup> as long as the following equation is true:\n",
    "\n",
    "\\begin{equation}B \\cdot B^{-1} = B^{-1} \\cdot B = I\\end{equation}\n",
    "\n",
    "**I**, you may recall, is an *identity* matrix; the matrix equivalent of 1.\n",
    "\n",
    "So how do you calculate the inverse of a matrix? For a 2x2 matrix, you can follow this formula:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}a & b\\\\c & d\\end{bmatrix}^{-1} = \\frac{1}{ad-bc}  \\begin{bmatrix}d & -b\\\\-c & a\\end{bmatrix}\\end{equation}\n",
    "\n",
    "What happened there?\n",
    "- We swapped the positions of *a* and *d*\n",
    "- We changed the signs of *b* and *c*\n",
    "- We multiplied the resulting matrix by 1 over the *determinant* of the matrix (*ad-bc*)\n",
    "\n",
    "Let's try with some actual numbers:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}6 & 2\\\\1 & 2\\end{bmatrix}^{-1} = \\frac{1}{(6\\times2)-(2\\times1)}  \\begin{bmatrix}2 & -2\\\\-1 & 6\\end{bmatrix}\\end{equation}\n",
    "\n",
    "So:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}6 & 2\\\\1 & 2\\end{bmatrix}^{-1} = \\frac{1}{10}  \\begin{bmatrix}2 & -2\\\\-1 & 6\\end{bmatrix}\\end{equation}\n",
    "\n",
    "Which gives us the result:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}6 & 2\\\\1 & 2\\end{bmatrix}^{-1} = \\begin{bmatrix}0.2 & -0.2\\\\-0.1 & 0.6\\end{bmatrix}\\end{equation}\n",
    "\n",
    "To check this, we can multiply the original matrix by its inverse to see if we get an identity matrix. This makes sense if you think about it; in the same way that 3 x <sup>1</sup>/<sub>3</sub> = 1, a matrix multiplied by its inverse results in an identity matrix:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}6 & 2\\\\1 & 2\\end{bmatrix} \\cdot \\begin{bmatrix}0.2 & -0.2\\\\-0.1 & 0.6\\end{bmatrix} = \\begin{bmatrix}(6\\times0.2)+(2\\times-0.1) & (6\\times-0.2)+(2\\times0.6)\\\\(1\\times0.2)+(2\\times-0.1) & (1\\times-0.2)+(2\\times0.6)\\end{bmatrix} = \\begin{bmatrix}1 & 0\\\\0 & 1\\end{bmatrix}\\end{equation}\n",
    "\n",
    "Note that not every matrix has an inverse - for example, if the determinant works out to be 0, the inverse matrix is not defined.\n",
    "\n",
    "矩阵$A$的逆矩阵$A^{-1}$，可能存在也可能不存在，其满足：\n",
    "\n",
    "\\begin{equation}A \\cdot A^{-1} = A^{-1} \\cdot A = I\\end{equation}\n",
    "矩阵的逆还有如下性质：\n",
    "*  并非每一个方阵都有逆矩阵，方阵是逆矩阵存在的必要条件，但非充分条件。若方阵$A$有逆矩阵，则$A$称为**非奇异矩阵**，否则称为**奇异矩阵**。\n",
    "* 若逆矩阵存在，则它是唯一的。\n",
    "* 逆矩阵的逆就是原矩阵：$(A^{-1})^{-1}=A$\n",
    "* 乘积的逆矩阵等于逆矩阵的乘积：$(A \\cdot B)^{-1}=B^{-1} \\cdot A^{-1}$\n",
    "* 转置的逆矩阵等于逆的转置：$(A^T)^{-1}=(A^{-1})^T$\n",
    "\n",
    "\n",
    "---\n",
    "\n",
    "In Python, you can use the *numpy.linalg.**inv*** function to get the inverse of a matrix in an *array* or *matrix* object:\n",
    "\n",
    "```python\n",
    "B=np.linalg.inv(A)# 对于通过array构建的矩阵使用inv方法\n",
    "C=B.I#对于通过matrix构建的矩阵使用.I 得到\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e3e30540-910d-4d19-8bb2-ceceae6a78cd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-24T03:10:08.617500Z",
     "iopub.status.busy": "2022-03-24T03:10:08.616979Z",
     "iopub.status.idle": "2022-03-24T03:10:08.626746Z",
     "shell.execute_reply": "2022-03-24T03:10:08.625955Z",
     "shell.execute_reply.started": "2022-03-24T03:10:08.617464Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.33333333 -0.16666667]\n",
      " [ 0.          0.5       ]]\n",
      "[[1. 0.]\n",
      " [0. 1.]]\n",
      "[[1. 0.]\n",
      " [0. 1.]]\n",
      "[[ 0.33333333 -0.16666667]\n",
      " [ 0.          0.5       ]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "A=np.array([[3,1],[0,2]])\n",
    "B=np.linalg.inv(A)\n",
    "print(B)\n",
    "print(A.dot(B))\n",
    "print(B.dot(A))\n",
    "#使用matrix构建的矩阵的逆\n",
    "D=np.mat([[3,1],[0,2]])\n",
    "E=D.I\n",
    "print(E)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2672ba1-2237-48a1-89a0-8bb570026662",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f3d1d387-b58a-4cba-8238-2beb6a9c0629",
   "metadata": {},
   "source": [
    "### Solving Systems of Equations with Matrices 通过矩阵解线性方程组\n",
    "One of the great things about matrices, is that they can help us solve systems of equations. For example, consider the following system of equations:\n",
    "\n",
    "\\begin{equation}2x + 4y = 18\\end{equation}\n",
    "\\begin{equation}6x + 2y = 34\\end{equation}\n",
    "\n",
    "We can write this in matrix form, like this:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}2 & 4\\\\6 & 2\\end{bmatrix} \\cdot \\begin{bmatrix}x\\\\y\\end{bmatrix}=\\begin{bmatrix}18\\\\34\\end{bmatrix}\\end{equation}\n",
    "\n",
    "Note that the variables (***x*** and ***y***) are  arranged as a column in one matrix, which is multiplied by a matrix containing the coefficients to produce as matrix containing the results. If you calculate the dot product on the left side, you can see clearly that this represents the original equations:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}2x + 4y\\\\6x + 2y\\end{bmatrix} =\\begin{bmatrix}18\\\\34\\end{bmatrix}\\end{equation}\n",
    "\n",
    "Now. let's name our matrices so we can better understand what comes next:\n",
    "\n",
    "\\begin{equation}A=\\begin{bmatrix}2 & 4\\\\6 & 2\\end{bmatrix}\\;\\;\\;\\;X=\\begin{bmatrix}x\\\\y\\end{bmatrix}\\;\\;\\;\\;B=\\begin{bmatrix}18\\\\34\\end{bmatrix}\\end{equation}\n",
    "\n",
    "We already know that ***A &bull; X = B***, which arithmetically means that ***X = B &div; A***. Since we can't actually divide by a matrix, we need to multiply by the inverse; so we can find the values for our variables (*X*) like this: ***X = A<sup>-1</sup> &bull; B***\n",
    "\n",
    "So, first we need the inverse of A:\n",
    "\n",
    "\\begin{equation}\\begin{bmatrix}2 & 4\\\\6 & 2\\end{bmatrix}^{-1} = \\frac{1}{(2\\times2)-(4\\times6)}  \\begin{bmatrix}2 & -4\\\\-6 & 2\\end{bmatrix}\\end{equation}\n",
    "\n",
    "\\begin{equation}= \\frac{1}{-20}  \\begin{bmatrix}2 & -4\\\\-6 & 2\\end{bmatrix}\\end{equation}\n",
    "\n",
    "\\begin{equation}=\\begin{bmatrix}-0.1 & 0.2\\\\0.3 & -0.1\\end{bmatrix}\\end{equation}\n",
    "\n",
    "Then we just multiply this with B:\n",
    "\n",
    "\\begin{equation}X = \\begin{bmatrix}-0.1 & 0.2\\\\0.3 & -0.1\\end{bmatrix} \\cdot \\begin{bmatrix}18\\\\34\\end{bmatrix}\\end{equation}\n",
    "\n",
    "\\begin{equation}X = \\begin{bmatrix}(-0.1 \\times 18)+(0.2 \\times 34)\\\\(0.3\\times18)+(-0.1\\times34)\\end{bmatrix}\\end{equation}\n",
    "\n",
    "\\begin{equation}X = \\begin{bmatrix}5\\\\2\\end{bmatrix}\\end{equation}\n",
    "\n",
    "The resulting matrix (*X*) contains the values for our *x* and *y* variables, and we can check these by plugging them into the original equations:\n",
    "\n",
    "\\begin{equation}(2\\times5) + (4\\times2) = 18\\end{equation}\n",
    "\\begin{equation}(6\\times5) + (2\\times2) = 34\\end{equation}\n",
    "\n",
    "These of course simplify to:\n",
    "\n",
    "\\begin{equation}10 + 8 = 18\\end{equation}\n",
    "\\begin{equation}30 + 4 = 34\\end{equation}\n",
    "\n",
    "So our variable values are correct.\n",
    "\n",
    "\n",
    "在空间上，可以将方程组中每一个方程视为一条空间中的向量$ v_n =\\{v_1,v_2,...,v_n\\}$，那么空间中的向量关系存在以下情况\n",
    "* 各个向量相交与一点，得到一个解集,即对应空间 $R^n$上的一个点\n",
    "* 若各个系数向量平行，则无解\n",
    "* 若各个系数向量重合，则有无穷多解\n",
    "\n",
    "\n",
    "---\n",
    "Numpy中也可以直接用np.linalg.slove(A,b)来求方程的解x，其中\n",
    "：A 为系数矩阵,b为常数向量矩阵，x为解向量即：\n",
    "```python\n",
    "Ab=x\n",
    "x=np.linalg.slove(A,b)\n",
    "```\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abb1d8c8-d8b4-4a0a-b119-c68167f49170",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "49592c70-fe8c-4585-8805-3b1532073145",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-03-27T07:30:58.460334Z",
     "iopub.status.busy": "2022-03-27T07:30:58.459914Z",
     "iopub.status.idle": "2022-03-27T07:30:58.469445Z",
     "shell.execute_reply": "2022-03-27T07:30:58.468844Z",
     "shell.execute_reply.started": "2022-03-27T07:30:58.460302Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "系数矩阵为： \n",
      " [[ 7 -1 -1]\n",
      " [10 -2  1]\n",
      " [ 6  3 -2]]\n",
      "A的逆矩阵为： [[-0.01639344  0.08196721  0.04918033]\n",
      " [-0.42622951  0.13114754  0.27868852]\n",
      " [-0.68852459  0.44262295  0.06557377]]\n",
      "常数向量为: \n",
      " [[0]\n",
      " [8]\n",
      " [7]]\n",
      "解为： [[1.]\n",
      " [3.]\n",
      " [4.]]\n",
      "通过slove方法求解： \n",
      " [[1.]\n",
      " [3.]\n",
      " [4.]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "\n",
    "\n",
    "\n",
    "A=np.array([[7,-1,-1],[10,-2,1],[6,3,-2]])\n",
    "\n",
    "print(\"系数矩阵为： \\n\",A)\n",
    "B=np.linalg.inv(A)\n",
    "print(\"A的逆矩阵为：\",B)\n",
    "b=np.array([[0,8,7]]).T#注意需要使用列向量\n",
    "x=np.dot(B,b)\n",
    "print(\"常数向量为: \\n\",b)\n",
    "#x=np.linalg.solve(A,b)\n",
    "print(\"解为：\",x)\n",
    "x2=np.linalg.solve(A,b)\n",
    "print(\"通过slove方法求解： \\n\",x2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e82c5aba-ed4a-49b7-abc3-e79fc300d8da",
   "metadata": {},
   "source": [
    "## 矩阵的非奇异性\n",
    "由上可知，方程有解那么其对应的系数矩阵必须可逆，或者说对应向量能够通过对应的矩阵坐标得到新的空间投影，前提是对应矩阵可逆，也即该矩阵为非奇异矩阵。\n",
    "\n",
    "1.当矩阵$A$为方正时，才可能有你矩阵（即可能是非奇异的），但这并不是充分条件。\n",
    "2.从线性方程的角度，方程组有唯一解的唯一可能是系数矩阵$A$的行或"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f30bb175-1862-42b3-9125-83bb2c50e2e5",
   "metadata": {},
   "source": [
    "### 行列式"
   ]
  },
  {
   "cell_type": "raw",
   "id": "c7440722-0adb-427a-8c88-02b9e7347a2b",
   "metadata": {},
   "source": [
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d58825bc-1592-44c0-93c8-250ab030ceb3",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
